dropzone.js ➔ getQueuedFiles   A
last analyzed

Complexity

Conditions 1

Size

Total Lines 3
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 2
dl 0
loc 3
rs 10
c 0
b 0
f 0
cc 1
1
"use strict";
2
3
function _typeof(obj) { "@babel/helpers - typeof"; if (typeof Symbol === "function" && typeof Symbol.iterator === "symbol") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; } return _typeof(obj); }
0 ignored issues
show
Unused Code introduced by
The expression "@babel/helpers - typeof" has no effects. Consider removing it.
Loading history...
4
5
function _possibleConstructorReturn(self, call) { if (call && (_typeof(call) === "object" || typeof call === "function")) { return call; } return _assertThisInitialized(self); }
6
7
function _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }
8
9
function _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return self; }
0 ignored issues
show
Coding Style introduced by
Consider using undefined instead of void(0). It is equivalent and more straightforward to read.
Loading history...
10
11
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }
12
13
function _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }
14
15
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
16
17
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
18
19
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
20
21
/*
22
 *
23
 * More info at [www.dropzonejs.com](http://www.dropzonejs.com)
24
 *
25
 * Copyright (c) 2012, Matias Meno
26
 *
27
 * Permission is hereby granted, free of charge, to any person obtaining a copy
28
 * of this software and associated documentation files (the "Software"), to deal
29
 * in the Software without restriction, including without limitation the rights
30
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
31
 * copies of the Software, and to permit persons to whom the Software is
32
 * furnished to do so, subject to the following conditions:
33
 *
34
 * The above copyright notice and this permission notice shall be included in
35
 * all copies or substantial portions of the Software.
36
 *
37
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
38
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
39
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
40
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
41
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
42
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
43
 * THE SOFTWARE.
44
 *
45
 */
46
// The Emitter class provides the ability to call `.on()` on Dropzone to listen
47
// to events.
48
// It is strongly based on component's emitter class, and I removed the
49
// functionality because of the dependency hell with different frameworks.
50
var Emitter =
51
/*#__PURE__*/
52
function () {
53
  function Emitter() {
54
    _classCallCheck(this, Emitter);
55
  }
56
57
  _createClass(Emitter, [{
58
    key: "on",
59
    // Add an event listener for given event
60
    value: function on(event, fn) {
61
      this._callbacks = this._callbacks || {}; // Create namespace for this event
62
63
      if (!this._callbacks[event]) {
64
        this._callbacks[event] = [];
65
      }
66
67
      this._callbacks[event].push(fn);
68
69
      return this;
70
    }
71
  }, {
72
    key: "emit",
73
    value: function emit(event) {
74
      this._callbacks = this._callbacks || {};
75
      var callbacks = this._callbacks[event];
76
77
      if (callbacks) {
78
        for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
0 ignored issues
show
Coding Style Best Practice introduced by
Using the Array constructor is generally discouraged. Consider using an array literal instead.
Loading history...
79
          args[_key - 1] = arguments[_key];
80
        }
81
82
        var _iteratorNormalCompletion = true;
83
        var _didIteratorError = false;
84
        var _iteratorError = undefined;
0 ignored issues
show
Unused Code Comprehensibility introduced by
The assignment of undefined is not necessary as _iteratorError is implicitly marked as undefined by the declaration.
Loading history...
85
86
        try {
87
          for (var _iterator = callbacks[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
88
            var callback = _step.value;
89
            callback.apply(this, args);
90
          }
91
        } catch (err) {
92
          _didIteratorError = true;
93
          _iteratorError = err;
94
        } finally {
95
          try {
96
            if (!_iteratorNormalCompletion && _iterator["return"] != null) {
97
              _iterator["return"]();
98
            }
99
          } finally {
100
            if (_didIteratorError) {
101
              throw _iteratorError;
0 ignored issues
show
Comprehensibility Bug introduced by
Usage of the throw statement in a finally clause is discouraged. This construct may mask errors and makes debugging difficult.
Loading history...
102
            }
103
          }
104
        }
105
      }
106
107
      return this;
108
    } // Remove event listener for given event. If fn is not provided, all event
109
    // listeners for that event will be removed. If neither is provided, all
110
    // event listeners will be removed.
111
112
  }, {
113
    key: "off",
114
    value: function off(event, fn) {
115
      if (!this._callbacks || arguments.length === 0) {
116
        this._callbacks = {};
117
        return this;
118
      } // specific event
119
120
121
      var callbacks = this._callbacks[event];
122
123
      if (!callbacks) {
124
        return this;
125
      } // remove all handlers
126
127
128
      if (arguments.length === 1) {
129
        delete this._callbacks[event];
130
        return this;
131
      } // remove specific handler
132
133
134
      for (var i = 0; i < callbacks.length; i++) {
135
        var callback = callbacks[i];
136
137
        if (callback === fn) {
138
          callbacks.splice(i, 1);
139
          break;
140
        }
141
      }
142
143
      return this;
144
    }
145
  }]);
146
147
  return Emitter;
148
}();
149
150
var Dropzone =
151
/*#__PURE__*/
152
function (_Emitter) {
153
  _inherits(Dropzone, _Emitter);
154
155
  _createClass(Dropzone, null, [{
156
    key: "initClass",
157
    value: function initClass() {
158
      // Exposing the emitter class, mainly for tests
159
      this.prototype.Emitter = Emitter;
160
      /*
161
       This is a list of all available events you can register on a dropzone object.
162
        You can register an event handler like this:
163
        dropzone.on("dragEnter", function() { });
164
        */
165
166
      this.prototype.events = ["drop", "dragstart", "dragend", "dragenter", "dragover", "dragleave", "addedfile", "addedfiles", "removedfile", "thumbnail", "error", "errormultiple", "processing", "processingmultiple", "uploadprogress", "totaluploadprogress", "sending", "sendingmultiple", "success", "successmultiple", "canceled", "canceledmultiple", "complete", "completemultiple", "reset", "maxfilesexceeded", "maxfilesreached", "queuecomplete"];
167
      this.prototype.defaultOptions = {
168
        /**
169
         * Has to be specified on elements other than form (or when the form
170
         * doesn't have an `action` attribute). You can also
171
         * provide a function that will be called with `files` and
172
         * must return the url (since `v3.12.0`)
173
         */
174
        url: null,
175
176
        /**
177
         * Can be changed to `"put"` if necessary. You can also provide a function
178
         * that will be called with `files` and must return the method (since `v3.12.0`).
179
         */
180
        method: "post",
181
182
        /**
183
         * Will be set on the XHRequest.
184
         */
185
        withCredentials: false,
186
187
        /**
188
         * The timeout for the XHR requests in milliseconds (since `v4.4.0`).
189
         */
190
        timeout: 30000,
191
192
        /**
193
         * How many file uploads to process in parallel (See the
194
         * Enqueuing file uploads documentation section for more info)
195
         */
196
        parallelUploads: 2,
197
198
        /**
199
         * Whether to send multiple files in one request. If
200
         * this it set to true, then the fallback file input element will
201
         * have the `multiple` attribute as well. This option will
202
         * also trigger additional events (like `processingmultiple`). See the events
203
         * documentation section for more information.
204
         */
205
        uploadMultiple: false,
206
207
        /**
208
         * Whether you want files to be uploaded in chunks to your server. This can't be
209
         * used in combination with `uploadMultiple`.
210
         *
211
         * See [chunksUploaded](#config-chunksUploaded) for the callback to finalise an upload.
212
         */
213
        chunking: false,
214
215
        /**
216
         * If `chunking` is enabled, this defines whether **every** file should be chunked,
217
         * even if the file size is below chunkSize. This means, that the additional chunk
218
         * form data will be submitted and the `chunksUploaded` callback will be invoked.
219
         */
220
        forceChunking: false,
221
222
        /**
223
         * If `chunking` is `true`, then this defines the chunk size in bytes.
224
         */
225
        chunkSize: 2000000,
226
227
        /**
228
         * If `true`, the individual chunks of a file are being uploaded simultaneously.
229
         */
230
        parallelChunkUploads: false,
231
232
        /**
233
         * Whether a chunk should be retried if it fails.
234
         */
235
        retryChunks: false,
236
237
        /**
238
         * If `retryChunks` is true, how many times should it be retried.
239
         */
240
        retryChunksLimit: 3,
241
242
        /**
243
         * If not `null` defines how many files this Dropzone handles. If it exceeds,
244
         * the event `maxfilesexceeded` will be called. The dropzone element gets the
245
         * class `dz-max-files-reached` accordingly so you can provide visual feedback.
246
         */
247
        maxFilesize: 256,
248
249
        /**
250
         * The name of the file param that gets transferred.
251
         * **NOTE**: If you have the option  `uploadMultiple` set to `true`, then
252
         * Dropzone will append `[]` to the name.
253
         */
254
        paramName: "file",
255
256
        /**
257
         * Whether thumbnails for images should be generated
258
         */
259
        createImageThumbnails: true,
260
261
        /**
262
         * In MB. When the filename exceeds this limit, the thumbnail will not be generated.
263
         */
264
        maxThumbnailFilesize: 10,
265
266
        /**
267
         * If `null`, the ratio of the image will be used to calculate it.
268
         */
269
        thumbnailWidth: 120,
270
271
        /**
272
         * The same as `thumbnailWidth`. If both are null, images will not be resized.
273
         */
274
        thumbnailHeight: 120,
275
276
        /**
277
         * How the images should be scaled down in case both, `thumbnailWidth` and `thumbnailHeight` are provided.
278
         * Can be either `contain` or `crop`.
279
         */
280
        thumbnailMethod: 'crop',
281
282
        /**
283
         * If set, images will be resized to these dimensions before being **uploaded**.
284
         * If only one, `resizeWidth` **or** `resizeHeight` is provided, the original aspect
285
         * ratio of the file will be preserved.
286
         *
287
         * The `options.transformFile` function uses these options, so if the `transformFile` function
288
         * is overridden, these options don't do anything.
289
         */
290
        resizeWidth: null,
291
292
        /**
293
         * See `resizeWidth`.
294
         */
295
        resizeHeight: null,
296
297
        /**
298
         * The mime type of the resized image (before it gets uploaded to the server).
299
         * If `null` the original mime type will be used. To force jpeg, for example, use `image/jpeg`.
300
         * See `resizeWidth` for more information.
301
         */
302
        resizeMimeType: null,
303
304
        /**
305
         * The quality of the resized images. See `resizeWidth`.
306
         */
307
        resizeQuality: 0.8,
308
309
        /**
310
         * How the images should be scaled down in case both, `resizeWidth` and `resizeHeight` are provided.
311
         * Can be either `contain` or `crop`.
312
         */
313
        resizeMethod: 'contain',
314
315
        /**
316
         * The base that is used to calculate the filesize. You can change this to
317
         * 1024 if you would rather display kibibytes, mebibytes, etc...
318
         * 1024 is technically incorrect, because `1024 bytes` are `1 kibibyte` not `1 kilobyte`.
319
         * You can change this to `1024` if you don't care about validity.
320
         */
321
        filesizeBase: 1000,
322
323
        /**
324
         * Can be used to limit the maximum number of files that will be handled by this Dropzone
325
         */
326
        maxFiles: null,
327
328
        /**
329
         * An optional object to send additional headers to the server. Eg:
330
         * `{ "My-Awesome-Header": "header value" }`
331
         */
332
        headers: null,
333
334
        /**
335
         * If `true`, the dropzone element itself will be clickable, if `false`
336
         * nothing will be clickable.
337
         *
338
         * You can also pass an HTML element, a CSS selector (for multiple elements)
339
         * or an array of those. In that case, all of those elements will trigger an
340
         * upload when clicked.
341
         */
342
        clickable: true,
343
344
        /**
345
         * Whether hidden files in directories should be ignored.
346
         */
347
        ignoreHiddenFiles: true,
348
349
        /**
350
         * The default implementation of `accept` checks the file's mime type or
351
         * extension against this list. This is a comma separated list of mime
352
         * types or file extensions.
353
         *
354
         * Eg.: `image/*,application/pdf,.psd`
355
         *
356
         * If the Dropzone is `clickable` this option will also be used as
357
         * [`accept`](https://developer.mozilla.org/en-US/docs/HTML/Element/input#attr-accept)
358
         * parameter on the hidden file input as well.
359
         */
360
        acceptedFiles: null,
361
362
        /**
363
         * **Deprecated!**
364
         * Use acceptedFiles instead.
365
         */
366
        acceptedMimeTypes: null,
367
368
        /**
369
         * If false, files will be added to the queue but the queue will not be
370
         * processed automatically.
371
         * This can be useful if you need some additional user input before sending
372
         * files (or if you want want all files sent at once).
373
         * If you're ready to send the file simply call `myDropzone.processQueue()`.
374
         *
375
         * See the [enqueuing file uploads](#enqueuing-file-uploads) documentation
376
         * section for more information.
377
         */
378
        autoProcessQueue: true,
379
380
        /**
381
         * If false, files added to the dropzone will not be queued by default.
382
         * You'll have to call `enqueueFile(file)` manually.
383
         */
384
        autoQueue: true,
385
386
        /**
387
         * If `true`, this will add a link to every file preview to remove or cancel (if
388
         * already uploading) the file. The `dictCancelUpload`, `dictCancelUploadConfirmation`
389
         * and `dictRemoveFile` options are used for the wording.
390
         */
391
        addRemoveLinks: false,
392
393
        /**
394
         * Defines where to display the file previews – if `null` the
395
         * Dropzone element itself is used. Can be a plain `HTMLElement` or a CSS
396
         * selector. The element should have the `dropzone-previews` class so
397
         * the previews are displayed properly.
398
         */
399
        previewsContainer: null,
400
401
        /**
402
         * This is the element the hidden input field (which is used when clicking on the
403
         * dropzone to trigger file selection) will be appended to. This might
404
         * be important in case you use frameworks to switch the content of your page.
405
         *
406
         * Can be a selector string, or an element directly.
407
         */
408
        hiddenInputContainer: "body",
409
410
        /**
411
         * If null, no capture type will be specified
412
         * If camera, mobile devices will skip the file selection and choose camera
413
         * If microphone, mobile devices will skip the file selection and choose the microphone
414
         * If camcorder, mobile devices will skip the file selection and choose the camera in video mode
415
         * On apple devices multiple must be set to false.  AcceptedFiles may need to
416
         * be set to an appropriate mime type (e.g. "image/*", "audio/*", or "video/*").
417
         */
418
        capture: null,
419
420
        /**
421
         * **Deprecated**. Use `renameFile` instead.
422
         */
423
        renameFilename: null,
424
425
        /**
426
         * A function that is invoked before the file is uploaded to the server and renames the file.
427
         * This function gets the `File` as argument and can use the `file.name`. The actual name of the
428
         * file that gets used during the upload can be accessed through `file.upload.filename`.
429
         */
430
        renameFile: null,
431
432
        /**
433
         * If `true` the fallback will be forced. This is very useful to test your server
434
         * implementations first and make sure that everything works as
435
         * expected without dropzone if you experience problems, and to test
436
         * how your fallbacks will look.
437
         */
438
        forceFallback: false,
439
440
        /**
441
         * The text used before any files are dropped.
442
         */
443
        dictDefaultMessage: "Drop files here to upload",
444
445
        /**
446
         * The text that replaces the default message text it the browser is not supported.
447
         */
448
        dictFallbackMessage: "Your browser does not support drag'n'drop file uploads.",
449
450
        /**
451
         * The text that will be added before the fallback form.
452
         * If you provide a  fallback element yourself, or if this option is `null` this will
453
         * be ignored.
454
         */
455
        dictFallbackText: "Please use the fallback form below to upload your files like in the olden days.",
456
457
        /**
458
         * If the filesize is too big.
459
         * `{{filesize}}` and `{{maxFilesize}}` will be replaced with the respective configuration values.
460
         */
461
        dictFileTooBig: "File is too big ({{filesize}}MiB). Max filesize: {{maxFilesize}}MiB.",
462
463
        /**
464
         * If the file doesn't match the file type.
465
         */
466
        dictInvalidFileType: "You can't upload files of this type.",
467
468
        /**
469
         * If the server response was invalid.
470
         * `{{statusCode}}` will be replaced with the servers status code.
471
         */
472
        dictResponseError: "Server responded with {{statusCode}} code.",
473
474
        /**
475
         * If `addRemoveLinks` is true, the text to be used for the cancel upload link.
476
         */
477
        dictCancelUpload: "Cancel upload",
478
479
        /**
480
         * The text that is displayed if an upload was manually canceled
481
         */
482
        dictUploadCanceled: "Upload canceled.",
483
484
        /**
485
         * If `addRemoveLinks` is true, the text to be used for confirmation when cancelling upload.
486
         */
487
        dictCancelUploadConfirmation: "Are you sure you want to cancel this upload?",
488
489
        /**
490
         * If `addRemoveLinks` is true, the text to be used to remove a file.
491
         */
492
        dictRemoveFile: "Remove file",
493
494
        /**
495
         * If this is not null, then the user will be prompted before removing a file.
496
         */
497
        dictRemoveFileConfirmation: null,
498
499
        /**
500
         * Displayed if `maxFiles` is st and exceeded.
501
         * The string `{{maxFiles}}` will be replaced by the configuration value.
502
         */
503
        dictMaxFilesExceeded: "You can not upload any more files.",
504
505
        /**
506
         * Allows you to translate the different units. Starting with `tb` for terabytes and going down to
507
         * `b` for bytes.
508
         */
509
        dictFileSizeUnits: {
510
          tb: "TB",
511
          gb: "GB",
512
          mb: "MB",
513
          kb: "KB",
514
          b: "b"
515
        },
516
517
        /**
518
         * Called when dropzone initialized
519
         * You can add event listeners here
520
         */
521
        init: function init() {},
522
523
        /**
524
         * Can be an **object** of additional parameters to transfer to the server, **or** a `Function`
525
         * that gets invoked with the `files`, `xhr` and, if it's a chunked upload, `chunk` arguments. In case
526
         * of a function, this needs to return a map.
527
         *
528
         * The default implementation does nothing for normal uploads, but adds relevant information for
529
         * chunked uploads.
530
         *
531
         * This is the same as adding hidden input fields in the form element.
532
         */
533
        params: function params(files, xhr, chunk) {
534
          if (chunk) {
535
            return {
536
              dzuuid: chunk.file.upload.uuid,
537
              dzchunkindex: chunk.index,
538
              dztotalfilesize: chunk.file.size,
539
              dzchunksize: this.options.chunkSize,
540
              dztotalchunkcount: chunk.file.upload.totalChunkCount,
541
              dzchunkbyteoffset: chunk.index * this.options.chunkSize
542
            };
543
          }
544
        },
545
546
        /**
547
         * A function that gets a [file](https://developer.mozilla.org/en-US/docs/DOM/File)
548
         * and a `done` function as parameters.
549
         *
550
         * If the done function is invoked without arguments, the file is "accepted" and will
551
         * be processed. If you pass an error message, the file is rejected, and the error
552
         * message will be displayed.
553
         * This function will not be called if the file is too big or doesn't match the mime types.
554
         */
555
        accept: function accept(file, done) {
556
          return done();
557
        },
558
559
        /**
560
         * The callback that will be invoked when all chunks have been uploaded for a file.
561
         * It gets the file for which the chunks have been uploaded as the first parameter,
562
         * and the `done` function as second. `done()` needs to be invoked when everything
563
         * needed to finish the upload process is done.
564
         */
565
        chunksUploaded: function chunksUploaded(file, done) {
566
          done();
567
        },
568
569
        /**
570
         * Gets called when the browser is not supported.
571
         * The default implementation shows the fallback input field and adds
572
         * a text.
573
         */
574
        fallback: function fallback() {
575
          // This code should pass in IE7... :(
576
          var messageElement;
577
          this.element.className = "".concat(this.element.className, " dz-browser-not-supported");
578
          var _iteratorNormalCompletion2 = true;
579
          var _didIteratorError2 = false;
580
          var _iteratorError2 = undefined;
0 ignored issues
show
Unused Code Comprehensibility introduced by
The assignment of undefined is not necessary as _iteratorError2 is implicitly marked as undefined by the declaration.
Loading history...
581
582
          try {
583
            for (var _iterator2 = this.element.getElementsByTagName("div")[Symbol.iterator](), _step2; !(_iteratorNormalCompletion2 = (_step2 = _iterator2.next()).done); _iteratorNormalCompletion2 = true) {
584
              var child = _step2.value;
585
586
              if (/(^| )dz-message($| )/.test(child.className)) {
587
                messageElement = child;
588
                child.className = "dz-message"; // Removes the 'dz-default' class
589
590
                break;
591
              }
592
            }
593
          } catch (err) {
594
            _didIteratorError2 = true;
595
            _iteratorError2 = err;
596
          } finally {
597
            try {
598
              if (!_iteratorNormalCompletion2 && _iterator2["return"] != null) {
599
                _iterator2["return"]();
600
              }
601
            } finally {
602
              if (_didIteratorError2) {
603
                throw _iteratorError2;
0 ignored issues
show
Comprehensibility Bug introduced by
Usage of the throw statement in a finally clause is discouraged. This construct may mask errors and makes debugging difficult.
Loading history...
604
              }
605
            }
606
          }
607
608
          if (!messageElement) {
609
            messageElement = Dropzone.createElement("<div class=\"dz-message\"><span></span></div>");
610
            this.element.appendChild(messageElement);
611
          }
612
613
          var span = messageElement.getElementsByTagName("span")[0];
614
615
          if (span) {
616
            if (span.textContent != null) {
617
              span.textContent = this.options.dictFallbackMessage;
618
            } else if (span.innerText != null) {
619
              span.innerText = this.options.dictFallbackMessage;
620
            }
621
          }
622
623
          return this.element.appendChild(this.getFallbackForm());
624
        },
625
626
        /**
627
         * Gets called to calculate the thumbnail dimensions.
628
         *
629
         * It gets `file`, `width` and `height` (both may be `null`) as parameters and must return an object containing:
630
         *
631
         *  - `srcWidth` & `srcHeight` (required)
632
         *  - `trgWidth` & `trgHeight` (required)
633
         *  - `srcX` & `srcY` (optional, default `0`)
634
         *  - `trgX` & `trgY` (optional, default `0`)
635
         *
636
         * Those values are going to be used by `ctx.drawImage()`.
637
         */
638
        resize: function resize(file, width, height, resizeMethod) {
639
          var info = {
640
            srcX: 0,
641
            srcY: 0,
642
            srcWidth: file.width,
643
            srcHeight: file.height
644
          };
645
          var srcRatio = file.width / file.height; // Automatically calculate dimensions if not specified
646
647
          if (width == null && height == null) {
648
            width = info.srcWidth;
649
            height = info.srcHeight;
650
          } else if (width == null) {
651
            width = height * srcRatio;
652
          } else if (height == null) {
653
            height = width / srcRatio;
654
          } // Make sure images aren't upscaled
655
656
657
          width = Math.min(width, info.srcWidth);
658
          height = Math.min(height, info.srcHeight);
659
          var trgRatio = width / height;
660
661
          if (info.srcWidth > width || info.srcHeight > height) {
662
            // Image is bigger and needs rescaling
663
            if (resizeMethod === 'crop') {
664
              if (srcRatio > trgRatio) {
665
                info.srcHeight = file.height;
666
                info.srcWidth = info.srcHeight * trgRatio;
667
              } else {
668
                info.srcWidth = file.width;
669
                info.srcHeight = info.srcWidth / trgRatio;
670
              }
671
            } else if (resizeMethod === 'contain') {
672
              // Method 'contain'
673
              if (srcRatio > trgRatio) {
674
                height = width / srcRatio;
675
              } else {
676
                width = height * srcRatio;
677
              }
678
            } else {
679
              throw new Error("Unknown resizeMethod '".concat(resizeMethod, "'"));
680
            }
681
          }
682
683
          info.srcX = (file.width - info.srcWidth) / 2;
684
          info.srcY = (file.height - info.srcHeight) / 2;
685
          info.trgWidth = width;
686
          info.trgHeight = height;
687
          return info;
688
        },
689
690
        /**
691
         * Can be used to transform the file (for example, resize an image if necessary).
692
         *
693
         * The default implementation uses `resizeWidth` and `resizeHeight` (if provided) and resizes
694
         * images according to those dimensions.
695
         *
696
         * Gets the `file` as the first parameter, and a `done()` function as the second, that needs
697
         * to be invoked with the file when the transformation is done.
698
         */
699
        transformFile: function transformFile(file, done) {
700
          if ((this.options.resizeWidth || this.options.resizeHeight) && file.type.match(/image.*/)) {
701
            return this.resizeImage(file, this.options.resizeWidth, this.options.resizeHeight, this.options.resizeMethod, done);
702
          } else {
703
            return done(file);
704
          }
705
        },
706
707
        /**
708
         * A string that contains the template used for each dropped
709
         * file. Change it to fulfill your needs but make sure to properly
710
         * provide all elements.
711
         *
712
         * If you want to use an actual HTML element instead of providing a String
713
         * as a config option, you could create a div with the id `tpl`,
714
         * put the template inside it and provide the element like this:
715
         *
716
         *     document
717
         *       .querySelector('#tpl')
718
         *       .innerHTML
719
         *
720
         */
721
        previewTemplate: "<div class=\"dz-preview dz-file-preview\">\n  <div class=\"dz-image\"><img data-dz-thumbnail /></div>\n  <div class=\"dz-details\">\n    <div class=\"dz-size\"><span data-dz-size></span></div>\n    <div class=\"dz-filename\"><span data-dz-name></span></div>\n  </div>\n  <div class=\"dz-progress\"><span class=\"dz-upload\" data-dz-uploadprogress></span></div>\n  <div class=\"dz-error-message\"><span data-dz-errormessage></span></div>\n  <div class=\"dz-success-mark\">\n    <svg width=\"54px\" height=\"54px\" viewBox=\"0 0 54 54\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n      <title>Check</title>\n      <g stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\">\n        <path d=\"M23.5,31.8431458 L17.5852419,25.9283877 C16.0248253,24.3679711 13.4910294,24.366835 11.9289322,25.9289322 C10.3700136,27.4878508 10.3665912,30.0234455 11.9283877,31.5852419 L20.4147581,40.0716123 C20.5133999,40.1702541 20.6159315,40.2626649 20.7218615,40.3488435 C22.2835669,41.8725651 24.794234,41.8626202 26.3461564,40.3106978 L43.3106978,23.3461564 C44.8771021,21.7797521 44.8758057,19.2483887 43.3137085,17.6862915 C41.7547899,16.1273729 39.2176035,16.1255422 37.6538436,17.6893022 L23.5,31.8431458 Z M27,53 C41.3594035,53 53,41.3594035 53,27 C53,12.6405965 41.3594035,1 27,1 C12.6405965,1 1,12.6405965 1,27 C1,41.3594035 12.6405965,53 27,53 Z\" stroke-opacity=\"0.198794158\" stroke=\"#747474\" fill-opacity=\"0.816519475\" fill=\"#FFFFFF\"></path>\n      </g>\n    </svg>\n  </div>\n  <div class=\"dz-error-mark\">\n    <svg width=\"54px\" height=\"54px\" viewBox=\"0 0 54 54\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n      <title>Error</title>\n      <g stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\">\n        <g stroke=\"#747474\" stroke-opacity=\"0.198794158\" fill=\"#FFFFFF\" fill-opacity=\"0.816519475\">\n          <path d=\"M32.6568542,29 L38.3106978,23.3461564 C39.8771021,21.7797521 39.8758057,19.2483887 38.3137085,17.6862915 C36.7547899,16.1273729 34.2176035,16.1255422 32.6538436,17.6893022 L27,23.3431458 L21.3461564,17.6893022 C19.7823965,16.1255422 17.2452101,16.1273729 15.6862915,17.6862915 C14.1241943,19.2483887 14.1228979,21.7797521 15.6893022,23.3461564 L21.3431458,29 L15.6893022,34.6538436 C14.1228979,36.2202479 14.1241943,38.7516113 15.6862915,40.3137085 C17.2452101,41.8726271 19.7823965,41.8744578 21.3461564,40.3106978 L27,34.6568542 L32.6538436,40.3106978 C34.2176035,41.8744578 36.7547899,41.8726271 38.3137085,40.3137085 C39.8758057,38.7516113 39.8771021,36.2202479 38.3106978,34.6538436 L32.6568542,29 Z M27,53 C41.3594035,53 53,41.3594035 53,27 C53,12.6405965 41.3594035,1 27,1 C12.6405965,1 1,12.6405965 1,27 C1,41.3594035 12.6405965,53 27,53 Z\"></path>\n        </g>\n      </g>\n    </svg>\n  </div>\n</div>",
722
        // END OPTIONS
723
        // (Required by the dropzone documentation parser)
724
725
        /*
726
         Those functions register themselves to the events on init and handle all
727
         the user interface specific stuff. Overwriting them won't break the upload
728
         but can break the way it's displayed.
729
         You can overwrite them if you don't like the default behavior. If you just
730
         want to add an additional event handler, register it on the dropzone object
731
         and don't overwrite those options.
732
         */
733
        // Those are self explanatory and simply concern the DragnDrop.
734
        drop: function drop(e) {
735
          return this.element.classList.remove("dz-drag-hover");
736
        },
737
        dragstart: function dragstart(e) {},
738
        dragend: function dragend(e) {
739
          return this.element.classList.remove("dz-drag-hover");
740
        },
741
        dragenter: function dragenter(e) {
742
          return this.element.classList.add("dz-drag-hover");
743
        },
744
        dragover: function dragover(e) {
745
          return this.element.classList.add("dz-drag-hover");
746
        },
747
        dragleave: function dragleave(e) {
748
          return this.element.classList.remove("dz-drag-hover");
749
        },
750
        paste: function paste(e) {},
751
        // Called whenever there are no files left in the dropzone anymore, and the
752
        // dropzone should be displayed as if in the initial state.
753
        reset: function reset() {
754
          return this.element.classList.remove("dz-started");
755
        },
756
        // Called when a file is added to the queue
757
        // Receives `file`
758
        addedfile: function addedfile(file) {
759
          var _this2 = this;
760
761
          if (this.element === this.previewsContainer) {
762
            this.element.classList.add("dz-started");
763
          }
764
765
          if (this.previewsContainer) {
766
            file.previewElement = Dropzone.createElement(this.options.previewTemplate.trim());
767
            file.previewTemplate = file.previewElement; // Backwards compatibility
768
769
            this.previewsContainer.appendChild(file.previewElement);
770
            var _iteratorNormalCompletion3 = true;
771
            var _didIteratorError3 = false;
772
            var _iteratorError3 = undefined;
0 ignored issues
show
Unused Code Comprehensibility introduced by
The assignment of undefined is not necessary as _iteratorError3 is implicitly marked as undefined by the declaration.
Loading history...
773
774
            try {
775
              for (var _iterator3 = file.previewElement.querySelectorAll("[data-dz-name]")[Symbol.iterator](), _step3; !(_iteratorNormalCompletion3 = (_step3 = _iterator3.next()).done); _iteratorNormalCompletion3 = true) {
776
                var node = _step3.value;
777
                node.textContent = file.name;
778
              }
779
            } catch (err) {
780
              _didIteratorError3 = true;
781
              _iteratorError3 = err;
782
            } finally {
783
              try {
784
                if (!_iteratorNormalCompletion3 && _iterator3["return"] != null) {
785
                  _iterator3["return"]();
786
                }
787
              } finally {
788
                if (_didIteratorError3) {
789
                  throw _iteratorError3;
0 ignored issues
show
Comprehensibility Bug introduced by
Usage of the throw statement in a finally clause is discouraged. This construct may mask errors and makes debugging difficult.
Loading history...
790
                }
791
              }
792
            }
793
794
            var _iteratorNormalCompletion4 = true;
795
            var _didIteratorError4 = false;
796
            var _iteratorError4 = undefined;
0 ignored issues
show
Unused Code Comprehensibility introduced by
The assignment of undefined is not necessary as _iteratorError4 is implicitly marked as undefined by the declaration.
Loading history...
797
798
            try {
799
              for (var _iterator4 = file.previewElement.querySelectorAll("[data-dz-size]")[Symbol.iterator](), _step4; !(_iteratorNormalCompletion4 = (_step4 = _iterator4.next()).done); _iteratorNormalCompletion4 = true) {
800
                node = _step4.value;
801
                node.innerHTML = this.filesize(file.size);
802
              }
803
            } catch (err) {
804
              _didIteratorError4 = true;
805
              _iteratorError4 = err;
806
            } finally {
807
              try {
808
                if (!_iteratorNormalCompletion4 && _iterator4["return"] != null) {
809
                  _iterator4["return"]();
810
                }
811
              } finally {
812
                if (_didIteratorError4) {
813
                  throw _iteratorError4;
0 ignored issues
show
Comprehensibility Bug introduced by
Usage of the throw statement in a finally clause is discouraged. This construct may mask errors and makes debugging difficult.
Loading history...
814
                }
815
              }
816
            }
817
818
            if (this.options.addRemoveLinks) {
819
              file._removeLink = Dropzone.createElement("<a class=\"dz-remove\" href=\"javascript:undefined;\" data-dz-remove>".concat(this.options.dictRemoveFile, "</a>"));
820
              file.previewElement.appendChild(file._removeLink);
821
            }
822
823
            var removeFileEvent = function removeFileEvent(e) {
824
              e.preventDefault();
825
              e.stopPropagation();
826
827
              if (file.status === Dropzone.UPLOADING) {
828
                return Dropzone.confirm(_this2.options.dictCancelUploadConfirmation, function () {
829
                  return _this2.removeFile(file);
830
                });
831
              } else {
832
                if (_this2.options.dictRemoveFileConfirmation) {
833
                  return Dropzone.confirm(_this2.options.dictRemoveFileConfirmation, function () {
834
                    return _this2.removeFile(file);
835
                  });
836
                } else {
837
                  return _this2.removeFile(file);
838
                }
839
              }
840
            };
841
842
            var _iteratorNormalCompletion5 = true;
843
            var _didIteratorError5 = false;
844
            var _iteratorError5 = undefined;
0 ignored issues
show
Unused Code Comprehensibility introduced by
The assignment of undefined is not necessary as _iteratorError5 is implicitly marked as undefined by the declaration.
Loading history...
845
846
            try {
847
              for (var _iterator5 = file.previewElement.querySelectorAll("[data-dz-remove]")[Symbol.iterator](), _step5; !(_iteratorNormalCompletion5 = (_step5 = _iterator5.next()).done); _iteratorNormalCompletion5 = true) {
848
                var removeLink = _step5.value;
849
                removeLink.addEventListener("click", removeFileEvent);
850
              }
851
            } catch (err) {
852
              _didIteratorError5 = true;
853
              _iteratorError5 = err;
854
            } finally {
855
              try {
856
                if (!_iteratorNormalCompletion5 && _iterator5["return"] != null) {
857
                  _iterator5["return"]();
858
                }
859
              } finally {
860
                if (_didIteratorError5) {
861
                  throw _iteratorError5;
0 ignored issues
show
Comprehensibility Bug introduced by
Usage of the throw statement in a finally clause is discouraged. This construct may mask errors and makes debugging difficult.
Loading history...
862
                }
863
              }
864
            }
865
          }
866
        },
867
        // Called whenever a file is removed.
868
        removedfile: function removedfile(file) {
869
          if (file.previewElement != null && file.previewElement.parentNode != null) {
870
            file.previewElement.parentNode.removeChild(file.previewElement);
871
          }
872
873
          return this._updateMaxFilesReachedClass();
874
        },
875
        // Called when a thumbnail has been generated
876
        // Receives `file` and `dataUrl`
877
        thumbnail: function thumbnail(file, dataUrl) {
878
          if (file.previewElement) {
879
            file.previewElement.classList.remove("dz-file-preview");
880
            var _iteratorNormalCompletion6 = true;
881
            var _didIteratorError6 = false;
882
            var _iteratorError6 = undefined;
0 ignored issues
show
Unused Code Comprehensibility introduced by
The assignment of undefined is not necessary as _iteratorError6 is implicitly marked as undefined by the declaration.
Loading history...
883
884
            try {
885
              for (var _iterator6 = file.previewElement.querySelectorAll("[data-dz-thumbnail]")[Symbol.iterator](), _step6; !(_iteratorNormalCompletion6 = (_step6 = _iterator6.next()).done); _iteratorNormalCompletion6 = true) {
886
                var thumbnailElement = _step6.value;
887
                thumbnailElement.alt = file.name;
888
                thumbnailElement.src = dataUrl;
889
              }
890
            } catch (err) {
891
              _didIteratorError6 = true;
892
              _iteratorError6 = err;
893
            } finally {
894
              try {
895
                if (!_iteratorNormalCompletion6 && _iterator6["return"] != null) {
896
                  _iterator6["return"]();
897
                }
898
              } finally {
899
                if (_didIteratorError6) {
900
                  throw _iteratorError6;
0 ignored issues
show
Comprehensibility Bug introduced by
Usage of the throw statement in a finally clause is discouraged. This construct may mask errors and makes debugging difficult.
Loading history...
901
                }
902
              }
903
            }
904
905
            return setTimeout(function () {
906
              return file.previewElement.classList.add("dz-image-preview");
907
            }, 1);
908
          }
909
        },
910
        // Called whenever an error occurs
911
        // Receives `file` and `message`
912
        error: function error(file, message) {
913
          if (file.previewElement) {
914
            file.previewElement.classList.add("dz-error");
915
916
            if (typeof message !== "string" && message.error) {
917
              message = message.error;
918
            }
919
920
            var _iteratorNormalCompletion7 = true;
921
            var _didIteratorError7 = false;
922
            var _iteratorError7 = undefined;
0 ignored issues
show
Unused Code Comprehensibility introduced by
The assignment of undefined is not necessary as _iteratorError7 is implicitly marked as undefined by the declaration.
Loading history...
923
924
            try {
925
              for (var _iterator7 = file.previewElement.querySelectorAll("[data-dz-errormessage]")[Symbol.iterator](), _step7; !(_iteratorNormalCompletion7 = (_step7 = _iterator7.next()).done); _iteratorNormalCompletion7 = true) {
926
                var node = _step7.value;
927
                node.textContent = message;
928
              }
929
            } catch (err) {
930
              _didIteratorError7 = true;
931
              _iteratorError7 = err;
932
            } finally {
933
              try {
934
                if (!_iteratorNormalCompletion7 && _iterator7["return"] != null) {
935
                  _iterator7["return"]();
936
                }
937
              } finally {
938
                if (_didIteratorError7) {
939
                  throw _iteratorError7;
0 ignored issues
show
Comprehensibility Bug introduced by
Usage of the throw statement in a finally clause is discouraged. This construct may mask errors and makes debugging difficult.
Loading history...
940
                }
941
              }
942
            }
943
          }
944
        },
945
        errormultiple: function errormultiple() {},
946
        // Called when a file gets processed. Since there is a cue, not all added
947
        // files are processed immediately.
948
        // Receives `file`
949
        processing: function processing(file) {
950
          if (file.previewElement) {
951
            file.previewElement.classList.add("dz-processing");
952
953
            if (file._removeLink) {
954
              return file._removeLink.innerHTML = this.options.dictCancelUpload;
955
            }
956
          }
957
        },
958
        processingmultiple: function processingmultiple() {},
959
        // Called whenever the upload progress gets updated.
960
        // Receives `file`, `progress` (percentage 0-100) and `bytesSent`.
961
        // To get the total number of bytes of the file, use `file.size`
962
        uploadprogress: function uploadprogress(file, progress, bytesSent) {
963
          if (file.previewElement) {
964
            var _iteratorNormalCompletion8 = true;
965
            var _didIteratorError8 = false;
966
            var _iteratorError8 = undefined;
0 ignored issues
show
Unused Code Comprehensibility introduced by
The assignment of undefined is not necessary as _iteratorError8 is implicitly marked as undefined by the declaration.
Loading history...
967
968
            try {
969
              for (var _iterator8 = file.previewElement.querySelectorAll("[data-dz-uploadprogress]")[Symbol.iterator](), _step8; !(_iteratorNormalCompletion8 = (_step8 = _iterator8.next()).done); _iteratorNormalCompletion8 = true) {
970
                var node = _step8.value;
971
                node.nodeName === 'PROGRESS' ? node.value = progress : node.style.width = "".concat(progress, "%");
972
              }
973
            } catch (err) {
974
              _didIteratorError8 = true;
975
              _iteratorError8 = err;
976
            } finally {
977
              try {
978
                if (!_iteratorNormalCompletion8 && _iterator8["return"] != null) {
979
                  _iterator8["return"]();
980
                }
981
              } finally {
982
                if (_didIteratorError8) {
983
                  throw _iteratorError8;
0 ignored issues
show
Comprehensibility Bug introduced by
Usage of the throw statement in a finally clause is discouraged. This construct may mask errors and makes debugging difficult.
Loading history...
984
                }
985
              }
986
            }
987
          }
988
        },
989
        // Called whenever the total upload progress gets updated.
990
        // Called with totalUploadProgress (0-100), totalBytes and totalBytesSent
991
        totaluploadprogress: function totaluploadprogress() {},
992
        // Called just before the file is sent. Gets the `xhr` object as second
993
        // parameter, so you can modify it (for example to add a CSRF token) and a
994
        // `formData` object to add additional information.
995
        sending: function sending() {},
996
        sendingmultiple: function sendingmultiple() {},
997
        // When the complete upload is finished and successful
998
        // Receives `file`
999
        success: function success(file) {
1000
          if (file.previewElement) {
1001
            return file.previewElement.classList.add("dz-success");
1002
          }
1003
        },
1004
        successmultiple: function successmultiple() {},
1005
        // When the upload is canceled.
1006
        canceled: function canceled(file) {
1007
          return this.emit("error", file, this.options.dictUploadCanceled);
1008
        },
1009
        canceledmultiple: function canceledmultiple() {},
1010
        // When the upload is finished, either with success or an error.
1011
        // Receives `file`
1012
        complete: function complete(file) {
1013
          if (file._removeLink) {
1014
            file._removeLink.innerHTML = this.options.dictRemoveFile;
1015
          }
1016
1017
          if (file.previewElement) {
1018
            return file.previewElement.classList.add("dz-complete");
1019
          }
1020
        },
1021
        completemultiple: function completemultiple() {},
1022
        maxfilesexceeded: function maxfilesexceeded() {},
1023
        maxfilesreached: function maxfilesreached() {},
1024
        queuecomplete: function queuecomplete() {},
1025
        addedfiles: function addedfiles() {}
1026
      };
1027
      this.prototype._thumbnailQueue = [];
1028
      this.prototype._processingThumbnail = false;
1029
    } // global utility
1030
1031
  }, {
1032
    key: "extend",
1033
    value: function extend(target) {
1034
      for (var _len2 = arguments.length, objects = new Array(_len2 > 1 ? _len2 - 1 : 0), _key2 = 1; _key2 < _len2; _key2++) {
0 ignored issues
show
Coding Style Best Practice introduced by
Using the Array constructor is generally discouraged. Consider using an array literal instead.
Loading history...
1035
        objects[_key2 - 1] = arguments[_key2];
1036
      }
1037
1038
      for (var _i = 0, _objects = objects; _i < _objects.length; _i++) {
1039
        var object = _objects[_i];
1040
1041
        for (var key in object) {
0 ignored issues
show
Complexity introduced by
A for in loop automatically includes the property of any prototype object, consider checking the key using hasOwnProperty.

When iterating over the keys of an object, this includes not only the keys of the object, but also keys contained in the prototype of that object. It is generally a best practice to check for these keys specifically:

var someObject;
for (var key in someObject) {
    if ( ! someObject.hasOwnProperty(key)) {
        continue; // Skip keys from the prototype.
    }

    doSomethingWith(key);
}
Loading history...
1042
          var val = object[key];
1043
          target[key] = val;
1044
        }
1045
      }
1046
1047
      return target;
1048
    }
1049
  }]);
1050
1051
  function Dropzone(el, options) {
1052
    var _this;
1053
1054
    _classCallCheck(this, Dropzone);
1055
1056
    _this = _possibleConstructorReturn(this, _getPrototypeOf(Dropzone).call(this));
1057
    var fallback, left;
1058
    _this.element = el; // For backwards compatibility since the version was in the prototype previously
1059
1060
    _this.version = Dropzone.version;
1061
    _this.defaultOptions.previewTemplate = _this.defaultOptions.previewTemplate.replace(/\n*/g, "");
1062
    _this.clickableElements = [];
1063
    _this.listeners = [];
1064
    _this.files = []; // All files
1065
1066
    if (typeof _this.element === "string") {
1067
      _this.element = document.querySelector(_this.element);
1068
    } // Not checking if instance of HTMLElement or Element since IE9 is extremely weird.
1069
1070
1071
    if (!_this.element || _this.element.nodeType == null) {
1072
      throw new Error("Invalid dropzone element.");
1073
    }
1074
1075
    if (_this.element.dropzone) {
1076
      throw new Error("Dropzone already attached.");
1077
    } // Now add this dropzone to the instances.
1078
1079
1080
    Dropzone.instances.push(_assertThisInitialized(_this)); // Put the dropzone inside the element itself.
1081
1082
    _this.element.dropzone = _assertThisInitialized(_this);
1083
    var elementOptions = (left = Dropzone.optionsForElement(_this.element)) != null ? left : {};
1084
    _this.options = Dropzone.extend({}, _this.defaultOptions, elementOptions, options != null ? options : {}); // If the browser failed, just call the fallback and leave
1085
1086
    if (_this.options.forceFallback || !Dropzone.isBrowserSupported()) {
1087
      return _possibleConstructorReturn(_this, _this.options.fallback.call(_assertThisInitialized(_this)));
1088
    } // @options.url = @element.getAttribute "action" unless @options.url?
1089
1090
1091
    if (_this.options.url == null) {
1092
      _this.options.url = _this.element.getAttribute("action");
1093
    }
1094
1095
    if (!_this.options.url) {
1096
      throw new Error("No URL provided.");
1097
    }
1098
1099
    if (_this.options.acceptedFiles && _this.options.acceptedMimeTypes) {
1100
      throw new Error("You can't provide both 'acceptedFiles' and 'acceptedMimeTypes'. 'acceptedMimeTypes' is deprecated.");
1101
    }
1102
1103
    if (_this.options.uploadMultiple && _this.options.chunking) {
1104
      throw new Error('You cannot set both: uploadMultiple and chunking.');
1105
    } // Backwards compatibility
1106
1107
1108
    if (_this.options.acceptedMimeTypes) {
1109
      _this.options.acceptedFiles = _this.options.acceptedMimeTypes;
1110
      delete _this.options.acceptedMimeTypes;
1111
    } // Backwards compatibility
1112
1113
1114
    if (_this.options.renameFilename != null) {
1115
      _this.options.renameFile = function (file) {
1116
        return _this.options.renameFilename.call(_assertThisInitialized(_this), file.name, file);
1117
      };
1118
    }
1119
1120
    _this.options.method = _this.options.method.toUpperCase();
1121
1122
    if ((fallback = _this.getExistingFallback()) && fallback.parentNode) {
1123
      // Remove the fallback
1124
      fallback.parentNode.removeChild(fallback);
1125
    } // Display previews in the previewsContainer element or the Dropzone element unless explicitly set to false
1126
1127
1128
    if (_this.options.previewsContainer !== false) {
1129
      if (_this.options.previewsContainer) {
1130
        _this.previewsContainer = Dropzone.getElement(_this.options.previewsContainer, "previewsContainer");
1131
      } else {
1132
        _this.previewsContainer = _this.element;
1133
      }
1134
    }
1135
1136
    if (_this.options.clickable) {
1137
      if (_this.options.clickable === true) {
1138
        _this.clickableElements = [_this.element];
1139
      } else {
1140
        _this.clickableElements = Dropzone.getElements(_this.options.clickable, "clickable");
1141
      }
1142
    }
1143
1144
    _this.init();
1145
1146
    return _this;
1147
  } // Returns all files that have been accepted
1148
1149
1150
  _createClass(Dropzone, [{
1151
    key: "getAcceptedFiles",
1152
    value: function getAcceptedFiles() {
1153
      return this.files.filter(function (file) {
1154
        return file.accepted;
1155
      }).map(function (file) {
1156
        return file;
1157
      });
1158
    } // Returns all files that have been rejected
1159
    // Not sure when that's going to be useful, but added for completeness.
1160
1161
  }, {
1162
    key: "getRejectedFiles",
1163
    value: function getRejectedFiles() {
1164
      return this.files.filter(function (file) {
1165
        return !file.accepted;
1166
      }).map(function (file) {
1167
        return file;
1168
      });
1169
    }
1170
  }, {
1171
    key: "getFilesWithStatus",
1172
    value: function getFilesWithStatus(status) {
1173
      return this.files.filter(function (file) {
1174
        return file.status === status;
1175
      }).map(function (file) {
1176
        return file;
1177
      });
1178
    } // Returns all files that are in the queue
1179
1180
  }, {
1181
    key: "getQueuedFiles",
1182
    value: function getQueuedFiles() {
1183
      return this.getFilesWithStatus(Dropzone.QUEUED);
1184
    }
1185
  }, {
1186
    key: "getUploadingFiles",
1187
    value: function getUploadingFiles() {
1188
      return this.getFilesWithStatus(Dropzone.UPLOADING);
1189
    }
1190
  }, {
1191
    key: "getAddedFiles",
1192
    value: function getAddedFiles() {
1193
      return this.getFilesWithStatus(Dropzone.ADDED);
1194
    } // Files that are either queued or uploading
1195
1196
  }, {
1197
    key: "getActiveFiles",
1198
    value: function getActiveFiles() {
1199
      return this.files.filter(function (file) {
1200
        return file.status === Dropzone.UPLOADING || file.status === Dropzone.QUEUED;
1201
      }).map(function (file) {
1202
        return file;
1203
      });
1204
    } // The function that gets called when Dropzone is initialized. You
1205
    // can (and should) setup event listeners inside this function.
1206
1207
  }, {
1208
    key: "init",
1209
    value: function init() {
1210
      var _this3 = this;
1211
1212
      // In case it isn't set already
1213
      if (this.element.tagName === "form") {
1214
        this.element.setAttribute("enctype", "multipart/form-data");
1215
      }
1216
1217
      if (this.element.classList.contains("dropzone") && !this.element.querySelector(".dz-message")) {
1218
        this.element.appendChild(Dropzone.createElement("<div class=\"dz-default dz-message\"><button class=\"dz-button\" type=\"button\">".concat(this.options.dictDefaultMessage, "</button></div>")));
1219
      }
1220
1221
      if (this.clickableElements.length) {
1222
        var setupHiddenFileInput = function setupHiddenFileInput() {
1223
          if (_this3.hiddenFileInput) {
1224
            _this3.hiddenFileInput.parentNode.removeChild(_this3.hiddenFileInput);
1225
          }
1226
1227
          _this3.hiddenFileInput = document.createElement("input");
1228
1229
          _this3.hiddenFileInput.setAttribute("type", "file");
1230
1231
          if (_this3.options.maxFiles === null || _this3.options.maxFiles > 1) {
1232
            _this3.hiddenFileInput.setAttribute("multiple", "multiple");
1233
          }
1234
1235
          _this3.hiddenFileInput.className = "dz-hidden-input";
1236
1237
          if (_this3.options.acceptedFiles !== null) {
1238
            _this3.hiddenFileInput.setAttribute("accept", _this3.options.acceptedFiles);
1239
          }
1240
1241
          if (_this3.options.capture !== null) {
1242
            _this3.hiddenFileInput.setAttribute("capture", _this3.options.capture);
1243
          } // Not setting `display="none"` because some browsers don't accept clicks
1244
          // on elements that aren't displayed.
1245
1246
1247
          _this3.hiddenFileInput.style.visibility = "hidden";
1248
          _this3.hiddenFileInput.style.position = "absolute";
1249
          _this3.hiddenFileInput.style.top = "0";
1250
          _this3.hiddenFileInput.style.left = "0";
1251
          _this3.hiddenFileInput.style.height = "0";
1252
          _this3.hiddenFileInput.style.width = "0";
1253
          Dropzone.getElement(_this3.options.hiddenInputContainer, 'hiddenInputContainer').appendChild(_this3.hiddenFileInput);
1254
          return _this3.hiddenFileInput.addEventListener("change", function () {
1255
            var files = _this3.hiddenFileInput.files;
1256
1257
            if (files.length) {
1258
              var _iteratorNormalCompletion9 = true;
1259
              var _didIteratorError9 = false;
1260
              var _iteratorError9 = undefined;
0 ignored issues
show
Unused Code Comprehensibility introduced by
The assignment of undefined is not necessary as _iteratorError9 is implicitly marked as undefined by the declaration.
Loading history...
1261
1262
              try {
1263
                for (var _iterator9 = files[Symbol.iterator](), _step9; !(_iteratorNormalCompletion9 = (_step9 = _iterator9.next()).done); _iteratorNormalCompletion9 = true) {
1264
                  var file = _step9.value;
1265
1266
                  _this3.addFile(file);
1267
                }
1268
              } catch (err) {
1269
                _didIteratorError9 = true;
1270
                _iteratorError9 = err;
1271
              } finally {
1272
                try {
1273
                  if (!_iteratorNormalCompletion9 && _iterator9["return"] != null) {
1274
                    _iterator9["return"]();
1275
                  }
1276
                } finally {
1277
                  if (_didIteratorError9) {
1278
                    throw _iteratorError9;
0 ignored issues
show
Comprehensibility Bug introduced by
Usage of the throw statement in a finally clause is discouraged. This construct may mask errors and makes debugging difficult.
Loading history...
1279
                  }
1280
                }
1281
              }
1282
            }
1283
1284
            _this3.emit("addedfiles", files);
1285
1286
            return setupHiddenFileInput();
1287
          });
1288
        };
1289
1290
        setupHiddenFileInput();
1291
      }
1292
1293
      this.URL = window.URL !== null ? window.URL : window.webkitURL; // Setup all event listeners on the Dropzone object itself.
1294
      // They're not in @setupEventListeners() because they shouldn't be removed
1295
      // again when the dropzone gets disabled.
1296
1297
      var _iteratorNormalCompletion10 = true;
1298
      var _didIteratorError10 = false;
1299
      var _iteratorError10 = undefined;
0 ignored issues
show
Unused Code Comprehensibility introduced by
The assignment of undefined is not necessary as _iteratorError10 is implicitly marked as undefined by the declaration.
Loading history...
1300
1301
      try {
1302
        for (var _iterator10 = this.events[Symbol.iterator](), _step10; !(_iteratorNormalCompletion10 = (_step10 = _iterator10.next()).done); _iteratorNormalCompletion10 = true) {
1303
          var eventName = _step10.value;
1304
          this.on(eventName, this.options[eventName]);
1305
        }
1306
      } catch (err) {
1307
        _didIteratorError10 = true;
1308
        _iteratorError10 = err;
1309
      } finally {
1310
        try {
1311
          if (!_iteratorNormalCompletion10 && _iterator10["return"] != null) {
1312
            _iterator10["return"]();
1313
          }
1314
        } finally {
1315
          if (_didIteratorError10) {
1316
            throw _iteratorError10;
0 ignored issues
show
Comprehensibility Bug introduced by
Usage of the throw statement in a finally clause is discouraged. This construct may mask errors and makes debugging difficult.
Loading history...
1317
          }
1318
        }
1319
      }
1320
1321
      this.on("uploadprogress", function () {
1322
        return _this3.updateTotalUploadProgress();
1323
      });
1324
      this.on("removedfile", function () {
1325
        return _this3.updateTotalUploadProgress();
1326
      });
1327
      this.on("canceled", function (file) {
1328
        return _this3.emit("complete", file);
1329
      }); // Emit a `queuecomplete` event if all files finished uploading.
1330
1331
      this.on("complete", function (file) {
1332
        if (_this3.getAddedFiles().length === 0 && _this3.getUploadingFiles().length === 0 && _this3.getQueuedFiles().length === 0) {
1333
          // This needs to be deferred so that `queuecomplete` really triggers after `complete`
1334
          return setTimeout(function () {
1335
            return _this3.emit("queuecomplete");
1336
          }, 0);
1337
        }
1338
      });
1339
1340
      var containsFiles = function containsFiles(e) {
1341
        return e.dataTransfer.types && e.dataTransfer.types.some(function (type) {
1342
          return type == "Files";
1343
        });
1344
      };
1345
1346
      var noPropagation = function noPropagation(e) {
1347
        // If there are no files, we don't want to stop
1348
        // propagation so we don't interfere with other
1349
        // drag and drop behaviour.
1350
        if (!containsFiles(e)) return;
0 ignored issues
show
Comprehensibility Best Practice introduced by
Are you sure this return statement is not missing an argument? If this is intended, consider adding an explicit undefined like return undefined;.
Loading history...
1351
        e.stopPropagation();
1352
1353
        if (e.preventDefault) {
1354
          return e.preventDefault();
1355
        } else {
1356
          return e.returnValue = false;
1357
        }
1358
      }; // Create the listeners
1359
1360
1361
      this.listeners = [{
1362
        element: this.element,
1363
        events: {
1364
          "dragstart": function dragstart(e) {
1365
            return _this3.emit("dragstart", e);
1366
          },
1367
          "dragenter": function dragenter(e) {
1368
            noPropagation(e);
1369
            return _this3.emit("dragenter", e);
1370
          },
1371
          "dragover": function dragover(e) {
1372
            // Makes it possible to drag files from chrome's download bar
1373
            // http://stackoverflow.com/questions/19526430/drag-and-drop-file-uploads-from-chrome-downloads-bar
1374
            // Try is required to prevent bug in Internet Explorer 11 (SCRIPT65535 exception)
1375
            var efct;
1376
1377
            try {
1378
              efct = e.dataTransfer.effectAllowed;
1379
            } catch (error) {}
0 ignored issues
show
Coding Style Comprehensibility Best Practice introduced by
Empty catch clauses should be used with caution; consider adding a comment why this is needed.
Loading history...
1380
1381
            e.dataTransfer.dropEffect = 'move' === efct || 'linkMove' === efct ? 'move' : 'copy';
1382
            noPropagation(e);
1383
            return _this3.emit("dragover", e);
1384
          },
1385
          "dragleave": function dragleave(e) {
1386
            return _this3.emit("dragleave", e);
1387
          },
1388
          "drop": function drop(e) {
1389
            noPropagation(e);
1390
            return _this3.drop(e);
1391
          },
1392
          "dragend": function dragend(e) {
1393
            return _this3.emit("dragend", e);
1394
          }
1395
        } // This is disabled right now, because the browsers don't implement it properly.
1396
        // "paste": (e) =>
1397
        //   noPropagation e
1398
        //   @paste e
1399
1400
      }];
1401
      this.clickableElements.forEach(function (clickableElement) {
1402
        return _this3.listeners.push({
1403
          element: clickableElement,
1404
          events: {
1405
            "click": function click(evt) {
1406
              // Only the actual dropzone or the message element should trigger file selection
1407
              if (clickableElement !== _this3.element || evt.target === _this3.element || Dropzone.elementInside(evt.target, _this3.element.querySelector(".dz-message"))) {
1408
                _this3.hiddenFileInput.click(); // Forward the click
1409
1410
              }
1411
1412
              return true;
1413
            }
1414
          }
1415
        });
1416
      });
1417
      this.enable();
1418
      return this.options.init.call(this);
1419
    } // Not fully tested yet
1420
1421
  }, {
1422
    key: "destroy",
1423
    value: function destroy() {
1424
      this.disable();
1425
      this.removeAllFiles(true);
1426
1427
      if (this.hiddenFileInput != null ? this.hiddenFileInput.parentNode : undefined) {
1428
        this.hiddenFileInput.parentNode.removeChild(this.hiddenFileInput);
1429
        this.hiddenFileInput = null;
1430
      }
1431
1432
      delete this.element.dropzone;
1433
      return Dropzone.instances.splice(Dropzone.instances.indexOf(this), 1);
1434
    }
1435
  }, {
1436
    key: "updateTotalUploadProgress",
1437
    value: function updateTotalUploadProgress() {
1438
      var totalUploadProgress;
1439
      var totalBytesSent = 0;
1440
      var totalBytes = 0;
1441
      var activeFiles = this.getActiveFiles();
1442
1443
      if (activeFiles.length) {
1444
        var _iteratorNormalCompletion11 = true;
1445
        var _didIteratorError11 = false;
1446
        var _iteratorError11 = undefined;
0 ignored issues
show
Unused Code Comprehensibility introduced by
The assignment of undefined is not necessary as _iteratorError11 is implicitly marked as undefined by the declaration.
Loading history...
1447
1448
        try {
1449
          for (var _iterator11 = this.getActiveFiles()[Symbol.iterator](), _step11; !(_iteratorNormalCompletion11 = (_step11 = _iterator11.next()).done); _iteratorNormalCompletion11 = true) {
1450
            var file = _step11.value;
1451
            totalBytesSent += file.upload.bytesSent;
1452
            totalBytes += file.upload.total;
1453
          }
1454
        } catch (err) {
1455
          _didIteratorError11 = true;
1456
          _iteratorError11 = err;
1457
        } finally {
1458
          try {
1459
            if (!_iteratorNormalCompletion11 && _iterator11["return"] != null) {
1460
              _iterator11["return"]();
1461
            }
1462
          } finally {
1463
            if (_didIteratorError11) {
1464
              throw _iteratorError11;
0 ignored issues
show
Comprehensibility Bug introduced by
Usage of the throw statement in a finally clause is discouraged. This construct may mask errors and makes debugging difficult.
Loading history...
1465
            }
1466
          }
1467
        }
1468
1469
        totalUploadProgress = 100 * totalBytesSent / totalBytes;
1470
      } else {
1471
        totalUploadProgress = 100;
1472
      }
1473
1474
      return this.emit("totaluploadprogress", totalUploadProgress, totalBytes, totalBytesSent);
1475
    } // @options.paramName can be a function taking one parameter rather than a string.
1476
    // A parameter name for a file is obtained simply by calling this with an index number.
1477
1478
  }, {
1479
    key: "_getParamName",
1480
    value: function _getParamName(n) {
1481
      if (typeof this.options.paramName === "function") {
1482
        return this.options.paramName(n);
1483
      } else {
1484
        return "".concat(this.options.paramName).concat(this.options.uploadMultiple ? "[".concat(n, "]") : "");
1485
      }
1486
    } // If @options.renameFile is a function,
1487
    // the function will be used to rename the file.name before appending it to the formData
1488
1489
  }, {
1490
    key: "_renameFile",
1491
    value: function _renameFile(file) {
1492
      if (typeof this.options.renameFile !== "function") {
1493
        return file.name;
1494
      }
1495
1496
      return this.options.renameFile(file);
1497
    } // Returns a form that can be used as fallback if the browser does not support DragnDrop
1498
    //
1499
    // If the dropzone is already a form, only the input field and button are returned. Otherwise a complete form element is provided.
1500
    // This code has to pass in IE7 :(
1501
1502
  }, {
1503
    key: "getFallbackForm",
1504
    value: function getFallbackForm() {
1505
      var existingFallback, form;
1506
1507
      if (existingFallback = this.getExistingFallback()) {
1508
        return existingFallback;
1509
      }
1510
1511
      var fieldsString = "<div class=\"dz-fallback\">";
1512
1513
      if (this.options.dictFallbackText) {
1514
        fieldsString += "<p>".concat(this.options.dictFallbackText, "</p>");
1515
      }
1516
1517
      fieldsString += "<input type=\"file\" name=\"".concat(this._getParamName(0), "\" ").concat(this.options.uploadMultiple ? 'multiple="multiple"' : undefined, " /><input type=\"submit\" value=\"Upload!\"></div>");
1518
      var fields = Dropzone.createElement(fieldsString);
1519
1520
      if (this.element.tagName !== "FORM") {
1521
        form = Dropzone.createElement("<form action=\"".concat(this.options.url, "\" enctype=\"multipart/form-data\" method=\"").concat(this.options.method, "\"></form>"));
1522
        form.appendChild(fields);
1523
      } else {
1524
        // Make sure that the enctype and method attributes are set properly
1525
        this.element.setAttribute("enctype", "multipart/form-data");
1526
        this.element.setAttribute("method", this.options.method);
1527
      }
1528
1529
      return form != null ? form : fields;
0 ignored issues
show
Bug introduced by
The variable form seems to not be initialized for all possible execution paths.
Loading history...
1530
    } // Returns the fallback elements if they exist already
1531
    //
1532
    // This code has to pass in IE7 :(
1533
1534
  }, {
1535
    key: "getExistingFallback",
1536
    value: function getExistingFallback() {
1537
      var getFallback = function getFallback(elements) {
1538
        var _iteratorNormalCompletion12 = true;
1539
        var _didIteratorError12 = false;
1540
        var _iteratorError12 = undefined;
0 ignored issues
show
Unused Code Comprehensibility introduced by
The assignment of undefined is not necessary as _iteratorError12 is implicitly marked as undefined by the declaration.
Loading history...
1541
1542
        try {
1543
          for (var _iterator12 = elements[Symbol.iterator](), _step12; !(_iteratorNormalCompletion12 = (_step12 = _iterator12.next()).done); _iteratorNormalCompletion12 = true) {
1544
            var el = _step12.value;
1545
1546
            if (/(^| )fallback($| )/.test(el.className)) {
1547
              return el;
1548
            }
1549
          }
1550
        } catch (err) {
1551
          _didIteratorError12 = true;
1552
          _iteratorError12 = err;
1553
        } finally {
1554
          try {
1555
            if (!_iteratorNormalCompletion12 && _iterator12["return"] != null) {
1556
              _iterator12["return"]();
1557
            }
1558
          } finally {
1559
            if (_didIteratorError12) {
1560
              throw _iteratorError12;
0 ignored issues
show
Comprehensibility Bug introduced by
Usage of the throw statement in a finally clause is discouraged. This construct may mask errors and makes debugging difficult.
Loading history...
1561
            }
1562
          }
1563
        }
1564
      };
1565
1566
      for (var _i2 = 0, _arr = ["div", "form"]; _i2 < _arr.length; _i2++) {
1567
        var tagName = _arr[_i2];
1568
        var fallback;
1569
1570
        if (fallback = getFallback(this.element.getElementsByTagName(tagName))) {
1571
          return fallback;
1572
        }
1573
      }
0 ignored issues
show
Best Practice introduced by
There is no return statement in this branch, but you do return something in other branches. Did you maybe miss it? If you do not want to return anything, consider adding return undefined; explicitly.
Loading history...
1574
    } // Activates all listeners stored in @listeners
1575
1576
  }, {
1577
    key: "setupEventListeners",
1578
    value: function setupEventListeners() {
1579
      return this.listeners.map(function (elementListeners) {
1580
        return function () {
1581
          var result = [];
1582
1583
          for (var event in elementListeners.events) {
0 ignored issues
show
Complexity introduced by
A for in loop automatically includes the property of any prototype object, consider checking the key using hasOwnProperty.

When iterating over the keys of an object, this includes not only the keys of the object, but also keys contained in the prototype of that object. It is generally a best practice to check for these keys specifically:

var someObject;
for (var key in someObject) {
    if ( ! someObject.hasOwnProperty(key)) {
        continue; // Skip keys from the prototype.
    }

    doSomethingWith(key);
}
Loading history...
1584
            var listener = elementListeners.events[event];
1585
            result.push(elementListeners.element.addEventListener(event, listener, false));
1586
          }
1587
1588
          return result;
1589
        }();
1590
      });
1591
    } // Deactivates all listeners stored in @listeners
1592
1593
  }, {
1594
    key: "removeEventListeners",
1595
    value: function removeEventListeners() {
1596
      return this.listeners.map(function (elementListeners) {
1597
        return function () {
1598
          var result = [];
1599
1600
          for (var event in elementListeners.events) {
0 ignored issues
show
Complexity introduced by
A for in loop automatically includes the property of any prototype object, consider checking the key using hasOwnProperty.

When iterating over the keys of an object, this includes not only the keys of the object, but also keys contained in the prototype of that object. It is generally a best practice to check for these keys specifically:

var someObject;
for (var key in someObject) {
    if ( ! someObject.hasOwnProperty(key)) {
        continue; // Skip keys from the prototype.
    }

    doSomethingWith(key);
}
Loading history...
1601
            var listener = elementListeners.events[event];
1602
            result.push(elementListeners.element.removeEventListener(event, listener, false));
1603
          }
1604
1605
          return result;
1606
        }();
1607
      });
1608
    } // Removes all event listeners and cancels all files in the queue or being processed.
1609
1610
  }, {
1611
    key: "disable",
1612
    value: function disable() {
1613
      var _this4 = this;
1614
1615
      this.clickableElements.forEach(function (element) {
1616
        return element.classList.remove("dz-clickable");
1617
      });
1618
      this.removeEventListeners();
1619
      this.disabled = true;
1620
      return this.files.map(function (file) {
1621
        return _this4.cancelUpload(file);
1622
      });
1623
    }
1624
  }, {
1625
    key: "enable",
1626
    value: function enable() {
1627
      delete this.disabled;
1628
      this.clickableElements.forEach(function (element) {
1629
        return element.classList.add("dz-clickable");
1630
      });
1631
      return this.setupEventListeners();
1632
    } // Returns a nicely formatted filesize
1633
1634
  }, {
1635
    key: "filesize",
1636
    value: function filesize(size) {
1637
      var selectedSize = 0;
1638
      var selectedUnit = "b";
1639
1640
      if (size > 0) {
1641
        var units = ['tb', 'gb', 'mb', 'kb', 'b'];
1642
1643
        for (var i = 0; i < units.length; i++) {
1644
          var unit = units[i];
1645
          var cutoff = Math.pow(this.options.filesizeBase, 4 - i) / 10;
1646
1647
          if (size >= cutoff) {
1648
            selectedSize = size / Math.pow(this.options.filesizeBase, 4 - i);
1649
            selectedUnit = unit;
1650
            break;
1651
          }
1652
        }
1653
1654
        selectedSize = Math.round(10 * selectedSize) / 10; // Cutting of digits
1655
      }
1656
1657
      return "<strong>".concat(selectedSize, "</strong> ").concat(this.options.dictFileSizeUnits[selectedUnit]);
1658
    } // Adds or removes the `dz-max-files-reached` class from the form.
1659
1660
  }, {
1661
    key: "_updateMaxFilesReachedClass",
1662
    value: function _updateMaxFilesReachedClass() {
1663
      if (this.options.maxFiles != null && this.getAcceptedFiles().length >= this.options.maxFiles) {
1664
        if (this.getAcceptedFiles().length === this.options.maxFiles) {
1665
          this.emit('maxfilesreached', this.files);
1666
        }
1667
1668
        return this.element.classList.add("dz-max-files-reached");
1669
      } else {
1670
        return this.element.classList.remove("dz-max-files-reached");
1671
      }
1672
    }
1673
  }, {
1674
    key: "drop",
1675
    value: function drop(e) {
1676
      if (!e.dataTransfer) {
1677
        return;
1678
      }
1679
1680
      this.emit("drop", e); // Convert the FileList to an Array
1681
      // This is necessary for IE11
1682
1683
      var files = [];
1684
1685
      for (var i = 0; i < e.dataTransfer.files.length; i++) {
1686
        files[i] = e.dataTransfer.files[i];
1687
      } // Even if it's a folder, files.length will contain the folders.
1688
1689
1690
      if (files.length) {
1691
        var items = e.dataTransfer.items;
1692
1693
        if (items && items.length && items[0].webkitGetAsEntry != null) {
1694
          // The browser supports dropping of folders, so handle items instead of files
1695
          this._addFilesFromItems(items);
1696
        } else {
1697
          this.handleFiles(files);
1698
        }
1699
      }
1700
1701
      this.emit("addedfiles", files);
1702
    }
1703
  }, {
1704
    key: "paste",
1705
    value: function paste(e) {
1706
      if (__guard__(e != null ? e.clipboardData : undefined, function (x) {
1707
        return x.items;
1708
      }) == null) {
1709
        return;
0 ignored issues
show
Comprehensibility Best Practice introduced by
Are you sure this return statement is not missing an argument? If this is intended, consider adding an explicit undefined like return undefined;.
Loading history...
1710
      }
1711
1712
      this.emit("paste", e);
1713
      var items = e.clipboardData.items;
1714
1715
      if (items.length) {
1716
        return this._addFilesFromItems(items);
1717
      }
1718
    }
1719
  }, {
1720
    key: "handleFiles",
1721
    value: function handleFiles(files) {
1722
      var _iteratorNormalCompletion13 = true;
1723
      var _didIteratorError13 = false;
1724
      var _iteratorError13 = undefined;
0 ignored issues
show
Unused Code Comprehensibility introduced by
The assignment of undefined is not necessary as _iteratorError13 is implicitly marked as undefined by the declaration.
Loading history...
1725
1726
      try {
1727
        for (var _iterator13 = files[Symbol.iterator](), _step13; !(_iteratorNormalCompletion13 = (_step13 = _iterator13.next()).done); _iteratorNormalCompletion13 = true) {
1728
          var file = _step13.value;
1729
          this.addFile(file);
1730
        }
1731
      } catch (err) {
1732
        _didIteratorError13 = true;
1733
        _iteratorError13 = err;
1734
      } finally {
1735
        try {
1736
          if (!_iteratorNormalCompletion13 && _iterator13["return"] != null) {
1737
            _iterator13["return"]();
1738
          }
1739
        } finally {
1740
          if (_didIteratorError13) {
1741
            throw _iteratorError13;
0 ignored issues
show
Comprehensibility Bug introduced by
Usage of the throw statement in a finally clause is discouraged. This construct may mask errors and makes debugging difficult.
Loading history...
1742
          }
1743
        }
1744
      }
1745
    } // When a folder is dropped (or files are pasted), items must be handled
1746
    // instead of files.
1747
1748
  }, {
1749
    key: "_addFilesFromItems",
1750
    value: function _addFilesFromItems(items) {
1751
      var _this5 = this;
1752
1753
      return function () {
1754
        var result = [];
1755
        var _iteratorNormalCompletion14 = true;
1756
        var _didIteratorError14 = false;
1757
        var _iteratorError14 = undefined;
0 ignored issues
show
Unused Code Comprehensibility introduced by
The assignment of undefined is not necessary as _iteratorError14 is implicitly marked as undefined by the declaration.
Loading history...
1758
1759
        try {
1760
          for (var _iterator14 = items[Symbol.iterator](), _step14; !(_iteratorNormalCompletion14 = (_step14 = _iterator14.next()).done); _iteratorNormalCompletion14 = true) {
1761
            var item = _step14.value;
1762
            var entry;
1763
1764
            if (item.webkitGetAsEntry != null && (entry = item.webkitGetAsEntry())) {
1765
              if (entry.isFile) {
1766
                result.push(_this5.addFile(item.getAsFile()));
1767
              } else if (entry.isDirectory) {
1768
                // Append all files from that directory to files
1769
                result.push(_this5._addFilesFromDirectory(entry, entry.name));
1770
              } else {
1771
                result.push(undefined);
1772
              }
1773
            } else if (item.getAsFile != null) {
1774
              if (item.kind == null || item.kind === "file") {
1775
                result.push(_this5.addFile(item.getAsFile()));
1776
              } else {
1777
                result.push(undefined);
1778
              }
1779
            } else {
1780
              result.push(undefined);
1781
            }
1782
          }
1783
        } catch (err) {
1784
          _didIteratorError14 = true;
1785
          _iteratorError14 = err;
1786
        } finally {
1787
          try {
1788
            if (!_iteratorNormalCompletion14 && _iterator14["return"] != null) {
1789
              _iterator14["return"]();
1790
            }
1791
          } finally {
1792
            if (_didIteratorError14) {
1793
              throw _iteratorError14;
0 ignored issues
show
Comprehensibility Bug introduced by
Usage of the throw statement in a finally clause is discouraged. This construct may mask errors and makes debugging difficult.
Loading history...
1794
            }
1795
          }
1796
        }
1797
1798
        return result;
1799
      }();
1800
    } // Goes through the directory, and adds each file it finds recursively
1801
1802
  }, {
1803
    key: "_addFilesFromDirectory",
1804
    value: function _addFilesFromDirectory(directory, path) {
1805
      var _this6 = this;
1806
1807
      var dirReader = directory.createReader();
1808
1809
      var errorHandler = function errorHandler(error) {
1810
        return __guardMethod__(console, 'log', function (o) {
1811
          return o.log(error);
1812
        });
1813
      };
1814
1815
      var readEntries = function readEntries() {
1816
        return dirReader.readEntries(function (entries) {
1817
          if (entries.length > 0) {
1818
            var _iteratorNormalCompletion15 = true;
1819
            var _didIteratorError15 = false;
1820
            var _iteratorError15 = undefined;
0 ignored issues
show
Unused Code Comprehensibility introduced by
The assignment of undefined is not necessary as _iteratorError15 is implicitly marked as undefined by the declaration.
Loading history...
1821
1822
            try {
1823
              for (var _iterator15 = entries[Symbol.iterator](), _step15; !(_iteratorNormalCompletion15 = (_step15 = _iterator15.next()).done); _iteratorNormalCompletion15 = true) {
1824
                var entry = _step15.value;
1825
1826
                if (entry.isFile) {
1827
                  entry.file(function (file) {
1828
                    if (_this6.options.ignoreHiddenFiles && file.name.substring(0, 1) === '.') {
1829
                      return;
0 ignored issues
show
Comprehensibility Best Practice introduced by
Are you sure this return statement is not missing an argument? If this is intended, consider adding an explicit undefined like return undefined;.
Loading history...
1830
                    }
1831
1832
                    file.fullPath = "".concat(path, "/").concat(file.name);
1833
                    return _this6.addFile(file);
1834
                  });
1835
                } else if (entry.isDirectory) {
1836
                  _this6._addFilesFromDirectory(entry, "".concat(path, "/").concat(entry.name));
1837
                }
1838
              } // Recursively call readEntries() again, since browser only handle
1839
              // the first 100 entries.
1840
              // See: https://developer.mozilla.org/en-US/docs/Web/API/DirectoryReader#readEntries
1841
1842
            } catch (err) {
1843
              _didIteratorError15 = true;
1844
              _iteratorError15 = err;
1845
            } finally {
1846
              try {
1847
                if (!_iteratorNormalCompletion15 && _iterator15["return"] != null) {
1848
                  _iterator15["return"]();
1849
                }
1850
              } finally {
1851
                if (_didIteratorError15) {
1852
                  throw _iteratorError15;
0 ignored issues
show
Comprehensibility Bug introduced by
Usage of the throw statement in a finally clause is discouraged. This construct may mask errors and makes debugging difficult.
Loading history...
1853
                }
1854
              }
1855
            }
1856
1857
            readEntries();
1858
          }
1859
1860
          return null;
1861
        }, errorHandler);
1862
      };
1863
1864
      return readEntries();
1865
    } // If `done()` is called without argument the file is accepted
1866
    // If you call it with an error message, the file is rejected
1867
    // (This allows for asynchronous validation)
1868
    //
1869
    // This function checks the filesize, and if the file.type passes the
1870
    // `acceptedFiles` check.
1871
1872
  }, {
1873
    key: "accept",
1874
    value: function accept(file, done) {
1875
      if (this.options.maxFilesize && file.size > this.options.maxFilesize * 1024 * 1024) {
1876
        done(this.options.dictFileTooBig.replace("{{filesize}}", Math.round(file.size / 1024 / 10.24) / 100).replace("{{maxFilesize}}", this.options.maxFilesize));
1877
      } else if (!Dropzone.isValidFile(file, this.options.acceptedFiles)) {
1878
        done(this.options.dictInvalidFileType);
1879
      } else if (this.options.maxFiles != null && this.getAcceptedFiles().length >= this.options.maxFiles) {
1880
        done(this.options.dictMaxFilesExceeded.replace("{{maxFiles}}", this.options.maxFiles));
1881
        this.emit("maxfilesexceeded", file);
1882
      } else {
1883
        this.options.accept.call(this, file, done);
1884
      }
1885
    }
1886
  }, {
1887
    key: "addFile",
1888
    value: function addFile(file) {
1889
      var _this7 = this;
1890
1891
      file.upload = {
1892
        uuid: Dropzone.uuidv4(),
1893
        progress: 0,
1894
        // Setting the total upload size to file.size for the beginning
1895
        // It's actual different than the size to be transmitted.
1896
        total: file.size,
1897
        bytesSent: 0,
1898
        filename: this._renameFile(file) // Not setting chunking information here, because the acutal data — and
1899
        // thus the chunks — might change if `options.transformFile` is set
1900
        // and does something to the data.
1901
1902
      };
1903
      this.files.push(file);
1904
      file.status = Dropzone.ADDED;
1905
      this.emit("addedfile", file);
1906
1907
      this._enqueueThumbnail(file);
1908
1909
      this.accept(file, function (error) {
1910
        if (error) {
1911
          file.accepted = false;
1912
1913
          _this7._errorProcessing([file], error); // Will set the file.status
1914
1915
        } else {
1916
          file.accepted = true;
1917
1918
          if (_this7.options.autoQueue) {
1919
            _this7.enqueueFile(file);
1920
          } // Will set .accepted = true
1921
1922
        }
1923
1924
        _this7._updateMaxFilesReachedClass();
1925
      });
1926
    } // Wrapper for enqueueFile
1927
1928
  }, {
1929
    key: "enqueueFiles",
1930
    value: function enqueueFiles(files) {
1931
      var _iteratorNormalCompletion16 = true;
1932
      var _didIteratorError16 = false;
1933
      var _iteratorError16 = undefined;
0 ignored issues
show
Unused Code Comprehensibility introduced by
The assignment of undefined is not necessary as _iteratorError16 is implicitly marked as undefined by the declaration.
Loading history...
1934
1935
      try {
1936
        for (var _iterator16 = files[Symbol.iterator](), _step16; !(_iteratorNormalCompletion16 = (_step16 = _iterator16.next()).done); _iteratorNormalCompletion16 = true) {
1937
          var file = _step16.value;
1938
          this.enqueueFile(file);
1939
        }
1940
      } catch (err) {
1941
        _didIteratorError16 = true;
1942
        _iteratorError16 = err;
1943
      } finally {
1944
        try {
1945
          if (!_iteratorNormalCompletion16 && _iterator16["return"] != null) {
1946
            _iterator16["return"]();
1947
          }
1948
        } finally {
1949
          if (_didIteratorError16) {
1950
            throw _iteratorError16;
0 ignored issues
show
Comprehensibility Bug introduced by
Usage of the throw statement in a finally clause is discouraged. This construct may mask errors and makes debugging difficult.
Loading history...
1951
          }
1952
        }
1953
      }
1954
1955
      return null;
1956
    }
1957
  }, {
1958
    key: "enqueueFile",
1959
    value: function enqueueFile(file) {
1960
      var _this8 = this;
1961
1962
      if (file.status === Dropzone.ADDED && file.accepted === true) {
1963
        file.status = Dropzone.QUEUED;
1964
1965
        if (this.options.autoProcessQueue) {
1966
          return setTimeout(function () {
1967
            return _this8.processQueue();
1968
          }, 0); // Deferring the call
1969
        }
1970
      } else {
1971
        throw new Error("This file can't be queued because it has already been processed or was rejected.");
1972
      }
1973
    }
1974
  }, {
1975
    key: "_enqueueThumbnail",
1976
    value: function _enqueueThumbnail(file) {
1977
      var _this9 = this;
1978
1979
      if (this.options.createImageThumbnails && file.type.match(/image.*/) && file.size <= this.options.maxThumbnailFilesize * 1024 * 1024) {
1980
        this._thumbnailQueue.push(file);
1981
1982
        return setTimeout(function () {
1983
          return _this9._processThumbnailQueue();
1984
        }, 0); // Deferring the call
1985
      }
1986
    }
1987
  }, {
1988
    key: "_processThumbnailQueue",
1989
    value: function _processThumbnailQueue() {
1990
      var _this10 = this;
1991
1992
      if (this._processingThumbnail || this._thumbnailQueue.length === 0) {
1993
        return;
0 ignored issues
show
Comprehensibility Best Practice introduced by
Are you sure this return statement is not missing an argument? If this is intended, consider adding an explicit undefined like return undefined;.
Loading history...
1994
      }
1995
1996
      this._processingThumbnail = true;
1997
1998
      var file = this._thumbnailQueue.shift();
1999
2000
      return this.createThumbnail(file, this.options.thumbnailWidth, this.options.thumbnailHeight, this.options.thumbnailMethod, true, function (dataUrl) {
2001
        _this10.emit("thumbnail", file, dataUrl);
2002
2003
        _this10._processingThumbnail = false;
2004
        return _this10._processThumbnailQueue();
2005
      });
2006
    } // Can be called by the user to remove a file
2007
2008
  }, {
2009
    key: "removeFile",
2010
    value: function removeFile(file) {
2011
      if (file.status === Dropzone.UPLOADING) {
2012
        this.cancelUpload(file);
2013
      }
2014
2015
      this.files = without(this.files, file);
2016
      this.emit("removedfile", file);
2017
2018
      if (this.files.length === 0) {
2019
        return this.emit("reset");
2020
      }
2021
    } // Removes all files that aren't currently processed from the list
2022
2023
  }, {
2024
    key: "removeAllFiles",
2025
    value: function removeAllFiles(cancelIfNecessary) {
2026
      // Create a copy of files since removeFile() changes the @files array.
2027
      if (cancelIfNecessary == null) {
2028
        cancelIfNecessary = false;
2029
      }
2030
2031
      var _iteratorNormalCompletion17 = true;
2032
      var _didIteratorError17 = false;
2033
      var _iteratorError17 = undefined;
0 ignored issues
show
Unused Code Comprehensibility introduced by
The assignment of undefined is not necessary as _iteratorError17 is implicitly marked as undefined by the declaration.
Loading history...
2034
2035
      try {
2036
        for (var _iterator17 = this.files.slice()[Symbol.iterator](), _step17; !(_iteratorNormalCompletion17 = (_step17 = _iterator17.next()).done); _iteratorNormalCompletion17 = true) {
2037
          var file = _step17.value;
2038
2039
          if (file.status !== Dropzone.UPLOADING || cancelIfNecessary) {
2040
            this.removeFile(file);
2041
          }
2042
        }
2043
      } catch (err) {
2044
        _didIteratorError17 = true;
2045
        _iteratorError17 = err;
2046
      } finally {
2047
        try {
2048
          if (!_iteratorNormalCompletion17 && _iterator17["return"] != null) {
2049
            _iterator17["return"]();
2050
          }
2051
        } finally {
2052
          if (_didIteratorError17) {
2053
            throw _iteratorError17;
0 ignored issues
show
Comprehensibility Bug introduced by
Usage of the throw statement in a finally clause is discouraged. This construct may mask errors and makes debugging difficult.
Loading history...
2054
          }
2055
        }
2056
      }
2057
2058
      return null;
2059
    } // Resizes an image before it gets sent to the server. This function is the default behavior of
2060
    // `options.transformFile` if `resizeWidth` or `resizeHeight` are set. The callback is invoked with
2061
    // the resized blob.
2062
2063
  }, {
2064
    key: "resizeImage",
2065
    value: function resizeImage(file, width, height, resizeMethod, callback) {
2066
      var _this11 = this;
2067
2068
      return this.createThumbnail(file, width, height, resizeMethod, true, function (dataUrl, canvas) {
2069
        if (canvas == null) {
2070
          // The image has not been resized
2071
          return callback(file);
2072
        } else {
2073
          var resizeMimeType = _this11.options.resizeMimeType;
2074
2075
          if (resizeMimeType == null) {
2076
            resizeMimeType = file.type;
2077
          }
2078
2079
          var resizedDataURL = canvas.toDataURL(resizeMimeType, _this11.options.resizeQuality);
2080
2081
          if (resizeMimeType === 'image/jpeg' || resizeMimeType === 'image/jpg') {
2082
            // Now add the original EXIF information
2083
            resizedDataURL = ExifRestore.restore(file.dataURL, resizedDataURL);
2084
          }
2085
2086
          return callback(Dropzone.dataURItoBlob(resizedDataURL));
2087
        }
2088
      });
2089
    }
2090
  }, {
2091
    key: "createThumbnail",
2092
    value: function createThumbnail(file, width, height, resizeMethod, fixOrientation, callback) {
2093
      var _this12 = this;
2094
2095
      var fileReader = new FileReader();
2096
2097
      fileReader.onload = function () {
2098
        file.dataURL = fileReader.result; // Don't bother creating a thumbnail for SVG images since they're vector
2099
2100
        if (file.type === "image/svg+xml") {
2101
          if (callback != null) {
2102
            callback(fileReader.result);
2103
          }
2104
2105
          return;
2106
        }
2107
2108
        _this12.createThumbnailFromUrl(file, width, height, resizeMethod, fixOrientation, callback);
2109
      };
2110
2111
      fileReader.readAsDataURL(file);
2112
    } // `mockFile` needs to have these attributes:
2113
    // 
2114
    //     { name: 'name', size: 12345, imageUrl: '' }
2115
    //
2116
    // `callback` will be invoked when the image has been downloaded and displayed.
2117
    // `crossOrigin` will be added to the `img` tag when accessing the file.
2118
2119
  }, {
2120
    key: "displayExistingFile",
2121
    value: function displayExistingFile(mockFile, imageUrl, callback, crossOrigin) {
2122
      var _this13 = this;
2123
2124
      var resizeThumbnail = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;
2125
      this.emit("addedfile", mockFile);
2126
      this.emit("complete", mockFile);
2127
2128
      if (!resizeThumbnail) {
2129
        this.emit("thumbnail", mockFile, imageUrl);
2130
        if (callback) callback();
2131
      } else {
2132
        var onDone = function onDone(thumbnail) {
2133
          _this13.emit('thumbnail', mockFile, thumbnail);
2134
2135
          if (callback) callback();
2136
        };
2137
2138
        mockFile.dataURL = imageUrl;
2139
        this.createThumbnailFromUrl(mockFile, this.options.thumbnailWidth, this.options.thumbnailHeight, this.options.resizeMethod, this.options.fixOrientation, onDone, crossOrigin);
2140
      }
2141
    }
2142
  }, {
2143
    key: "createThumbnailFromUrl",
2144
    value: function createThumbnailFromUrl(file, width, height, resizeMethod, fixOrientation, callback, crossOrigin) {
2145
      var _this14 = this;
2146
2147
      // Not using `new Image` here because of a bug in latest Chrome versions.
2148
      // See https://github.com/enyo/dropzone/pull/226
2149
      var img = document.createElement("img");
2150
2151
      if (crossOrigin) {
2152
        img.crossOrigin = crossOrigin;
2153
      }
2154
2155
      img.onload = function () {
2156
        var loadExif = function loadExif(callback) {
2157
          return callback(1);
2158
        };
2159
2160
        if (typeof EXIF !== 'undefined' && EXIF !== null && fixOrientation) {
2161
          loadExif = function loadExif(callback) {
2162
            return EXIF.getData(img, function () {
2163
              return callback(EXIF.getTag(this, 'Orientation'));
2164
            });
2165
          };
2166
        }
2167
2168
        return loadExif(function (orientation) {
2169
          file.width = img.width;
2170
          file.height = img.height;
2171
2172
          var resizeInfo = _this14.options.resize.call(_this14, file, width, height, resizeMethod);
2173
2174
          var canvas = document.createElement("canvas");
2175
          var ctx = canvas.getContext("2d");
2176
          canvas.width = resizeInfo.trgWidth;
2177
          canvas.height = resizeInfo.trgHeight;
2178
2179
          if (orientation > 4) {
2180
            canvas.width = resizeInfo.trgHeight;
2181
            canvas.height = resizeInfo.trgWidth;
2182
          }
2183
2184
          switch (orientation) {
2185
            case 2:
2186
              // horizontal flip
2187
              ctx.translate(canvas.width, 0);
2188
              ctx.scale(-1, 1);
2189
              break;
2190
2191
            case 3:
2192
              // 180° rotate left
2193
              ctx.translate(canvas.width, canvas.height);
2194
              ctx.rotate(Math.PI);
2195
              break;
2196
2197
            case 4:
2198
              // vertical flip
2199
              ctx.translate(0, canvas.height);
2200
              ctx.scale(1, -1);
2201
              break;
2202
2203
            case 5:
2204
              // vertical flip + 90 rotate right
2205
              ctx.rotate(0.5 * Math.PI);
2206
              ctx.scale(1, -1);
2207
              break;
2208
2209
            case 6:
2210
              // 90° rotate right
2211
              ctx.rotate(0.5 * Math.PI);
2212
              ctx.translate(0, -canvas.width);
2213
              break;
2214
2215
            case 7:
2216
              // horizontal flip + 90 rotate right
2217
              ctx.rotate(0.5 * Math.PI);
2218
              ctx.translate(canvas.height, -canvas.width);
2219
              ctx.scale(-1, 1);
2220
              break;
2221
2222
            case 8:
2223
              // 90° rotate left
2224
              ctx.rotate(-0.5 * Math.PI);
2225
              ctx.translate(-canvas.height, 0);
2226
              break;
2227
          } // This is a bugfix for iOS' scaling bug.
2228
2229
2230
          drawImageIOSFix(ctx, img, resizeInfo.srcX != null ? resizeInfo.srcX : 0, resizeInfo.srcY != null ? resizeInfo.srcY : 0, resizeInfo.srcWidth, resizeInfo.srcHeight, resizeInfo.trgX != null ? resizeInfo.trgX : 0, resizeInfo.trgY != null ? resizeInfo.trgY : 0, resizeInfo.trgWidth, resizeInfo.trgHeight);
2231
          var thumbnail = canvas.toDataURL("image/png");
2232
2233
          if (callback != null) {
2234
            return callback(thumbnail, canvas);
2235
          }
2236
        });
2237
      };
2238
2239
      if (callback != null) {
2240
        img.onerror = callback;
2241
      }
2242
2243
      return img.src = file.dataURL;
2244
    } // Goes through the queue and processes files if there aren't too many already.
2245
2246
  }, {
2247
    key: "processQueue",
2248
    value: function processQueue() {
2249
      var parallelUploads = this.options.parallelUploads;
2250
      var processingLength = this.getUploadingFiles().length;
2251
      var i = processingLength; // There are already at least as many files uploading than should be
2252
2253
      if (processingLength >= parallelUploads) {
2254
        return;
0 ignored issues
show
Comprehensibility Best Practice introduced by
Are you sure this return statement is not missing an argument? If this is intended, consider adding an explicit undefined like return undefined;.
Loading history...
2255
      }
2256
2257
      var queuedFiles = this.getQueuedFiles();
2258
2259
      if (!(queuedFiles.length > 0)) {
2260
        return;
0 ignored issues
show
Comprehensibility Best Practice introduced by
Are you sure this return statement is not missing an argument? If this is intended, consider adding an explicit undefined like return undefined;.
Loading history...
2261
      }
2262
2263
      if (this.options.uploadMultiple) {
2264
        // The files should be uploaded in one request
2265
        return this.processFiles(queuedFiles.slice(0, parallelUploads - processingLength));
2266
      } else {
2267
        while (i < parallelUploads) {
2268
          if (!queuedFiles.length) {
2269
            return;
0 ignored issues
show
Comprehensibility Best Practice introduced by
Are you sure this return statement is not missing an argument? If this is intended, consider adding an explicit undefined like return undefined;.
Loading history...
2270
          } // Nothing left to process
2271
2272
2273
          this.processFile(queuedFiles.shift());
2274
          i++;
2275
        }
0 ignored issues
show
Best Practice introduced by
There is no return statement in this branch, but you do return something in other branches. Did you maybe miss it? If you do not want to return anything, consider adding return undefined; explicitly.
Loading history...
2276
      }
2277
    } // Wrapper for `processFiles`
2278
2279
  }, {
2280
    key: "processFile",
2281
    value: function processFile(file) {
2282
      return this.processFiles([file]);
2283
    } // Loads the file, then calls finishedLoading()
2284
2285
  }, {
2286
    key: "processFiles",
2287
    value: function processFiles(files) {
2288
      var _iteratorNormalCompletion18 = true;
2289
      var _didIteratorError18 = false;
2290
      var _iteratorError18 = undefined;
0 ignored issues
show
Unused Code Comprehensibility introduced by
The assignment of undefined is not necessary as _iteratorError18 is implicitly marked as undefined by the declaration.
Loading history...
2291
2292
      try {
2293
        for (var _iterator18 = files[Symbol.iterator](), _step18; !(_iteratorNormalCompletion18 = (_step18 = _iterator18.next()).done); _iteratorNormalCompletion18 = true) {
2294
          var file = _step18.value;
2295
          file.processing = true; // Backwards compatibility
2296
2297
          file.status = Dropzone.UPLOADING;
2298
          this.emit("processing", file);
2299
        }
2300
      } catch (err) {
2301
        _didIteratorError18 = true;
2302
        _iteratorError18 = err;
2303
      } finally {
2304
        try {
2305
          if (!_iteratorNormalCompletion18 && _iterator18["return"] != null) {
2306
            _iterator18["return"]();
2307
          }
2308
        } finally {
2309
          if (_didIteratorError18) {
2310
            throw _iteratorError18;
0 ignored issues
show
Comprehensibility Bug introduced by
Usage of the throw statement in a finally clause is discouraged. This construct may mask errors and makes debugging difficult.
Loading history...
2311
          }
2312
        }
2313
      }
2314
2315
      if (this.options.uploadMultiple) {
2316
        this.emit("processingmultiple", files);
2317
      }
2318
2319
      return this.uploadFiles(files);
2320
    }
2321
  }, {
2322
    key: "_getFilesWithXhr",
2323
    value: function _getFilesWithXhr(xhr) {
2324
      var files;
2325
      return files = this.files.filter(function (file) {
0 ignored issues
show
Unused Code introduced by
The assignment to variable files seems to be never used. Consider removing it.
Loading history...
Comprehensibility introduced by
Are you sure you want to assign to files here, or did you intend to make a comparison like files === this.files.fil...aram) { return file; })?
Loading history...
2326
        return file.xhr === xhr;
2327
      }).map(function (file) {
2328
        return file;
2329
      });
2330
    } // Cancels the file upload and sets the status to CANCELED
2331
    // **if** the file is actually being uploaded.
2332
    // If it's still in the queue, the file is being removed from it and the status
2333
    // set to CANCELED.
2334
2335
  }, {
2336
    key: "cancelUpload",
2337
    value: function cancelUpload(file) {
2338
      if (file.status === Dropzone.UPLOADING) {
2339
        var groupedFiles = this._getFilesWithXhr(file.xhr);
2340
2341
        var _iteratorNormalCompletion19 = true;
2342
        var _didIteratorError19 = false;
2343
        var _iteratorError19 = undefined;
0 ignored issues
show
Unused Code Comprehensibility introduced by
The assignment of undefined is not necessary as _iteratorError19 is implicitly marked as undefined by the declaration.
Loading history...
2344
2345
        try {
2346
          for (var _iterator19 = groupedFiles[Symbol.iterator](), _step19; !(_iteratorNormalCompletion19 = (_step19 = _iterator19.next()).done); _iteratorNormalCompletion19 = true) {
2347
            var groupedFile = _step19.value;
2348
            groupedFile.status = Dropzone.CANCELED;
2349
          }
2350
        } catch (err) {
2351
          _didIteratorError19 = true;
2352
          _iteratorError19 = err;
2353
        } finally {
2354
          try {
2355
            if (!_iteratorNormalCompletion19 && _iterator19["return"] != null) {
2356
              _iterator19["return"]();
2357
            }
2358
          } finally {
2359
            if (_didIteratorError19) {
2360
              throw _iteratorError19;
0 ignored issues
show
Comprehensibility Bug introduced by
Usage of the throw statement in a finally clause is discouraged. This construct may mask errors and makes debugging difficult.
Loading history...
2361
            }
2362
          }
2363
        }
2364
2365
        if (typeof file.xhr !== 'undefined') {
2366
          file.xhr.abort();
2367
        }
2368
2369
        var _iteratorNormalCompletion20 = true;
2370
        var _didIteratorError20 = false;
2371
        var _iteratorError20 = undefined;
0 ignored issues
show
Unused Code Comprehensibility introduced by
The assignment of undefined is not necessary as _iteratorError20 is implicitly marked as undefined by the declaration.
Loading history...
2372
2373
        try {
2374
          for (var _iterator20 = groupedFiles[Symbol.iterator](), _step20; !(_iteratorNormalCompletion20 = (_step20 = _iterator20.next()).done); _iteratorNormalCompletion20 = true) {
2375
            var _groupedFile = _step20.value;
2376
            this.emit("canceled", _groupedFile);
2377
          }
2378
        } catch (err) {
2379
          _didIteratorError20 = true;
2380
          _iteratorError20 = err;
2381
        } finally {
2382
          try {
2383
            if (!_iteratorNormalCompletion20 && _iterator20["return"] != null) {
2384
              _iterator20["return"]();
2385
            }
2386
          } finally {
2387
            if (_didIteratorError20) {
2388
              throw _iteratorError20;
0 ignored issues
show
Comprehensibility Bug introduced by
Usage of the throw statement in a finally clause is discouraged. This construct may mask errors and makes debugging difficult.
Loading history...
2389
            }
2390
          }
2391
        }
2392
2393
        if (this.options.uploadMultiple) {
2394
          this.emit("canceledmultiple", groupedFiles);
2395
        }
2396
      } else if (file.status === Dropzone.ADDED || file.status === Dropzone.QUEUED) {
2397
        file.status = Dropzone.CANCELED;
2398
        this.emit("canceled", file);
2399
2400
        if (this.options.uploadMultiple) {
2401
          this.emit("canceledmultiple", [file]);
2402
        }
2403
      }
2404
2405
      if (this.options.autoProcessQueue) {
2406
        return this.processQueue();
2407
      }
2408
    }
2409
  }, {
2410
    key: "resolveOption",
2411
    value: function resolveOption(option) {
2412
      if (typeof option === 'function') {
2413
        for (var _len3 = arguments.length, args = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) {
0 ignored issues
show
Coding Style Best Practice introduced by
Using the Array constructor is generally discouraged. Consider using an array literal instead.
Loading history...
2414
          args[_key3 - 1] = arguments[_key3];
2415
        }
2416
2417
        return option.apply(this, args);
2418
      }
2419
2420
      return option;
2421
    }
2422
  }, {
2423
    key: "uploadFile",
2424
    value: function uploadFile(file) {
2425
      return this.uploadFiles([file]);
2426
    }
2427
  }, {
2428
    key: "uploadFiles",
2429
    value: function uploadFiles(files) {
2430
      var _this15 = this;
2431
2432
      this._transformFiles(files, function (transformedFiles) {
2433
        if (_this15.options.chunking) {
2434
          // Chunking is not allowed to be used with `uploadMultiple` so we know
2435
          // that there is only __one__file.
2436
          var transformedFile = transformedFiles[0];
2437
          files[0].upload.chunked = _this15.options.chunking && (_this15.options.forceChunking || transformedFile.size > _this15.options.chunkSize);
2438
          files[0].upload.totalChunkCount = Math.ceil(transformedFile.size / _this15.options.chunkSize);
2439
        }
2440
2441
        if (files[0].upload.chunked) {
2442
          // This file should be sent in chunks!
2443
          // If the chunking option is set, we **know** that there can only be **one** file, since
2444
          // uploadMultiple is not allowed with this option.
2445
          var file = files[0];
2446
          var _transformedFile = transformedFiles[0];
2447
          var startedChunkCount = 0;
2448
          file.upload.chunks = [];
2449
2450
          var handleNextChunk = function handleNextChunk() {
2451
            var chunkIndex = 0; // Find the next item in file.upload.chunks that is not defined yet.
2452
2453
            while (file.upload.chunks[chunkIndex] !== undefined) {
2454
              chunkIndex++;
2455
            } // This means, that all chunks have already been started.
2456
2457
2458
            if (chunkIndex >= file.upload.totalChunkCount) return;
2459
            startedChunkCount++;
2460
            var start = chunkIndex * _this15.options.chunkSize;
2461
            var end = Math.min(start + _this15.options.chunkSize, file.size);
2462
            var dataBlock = {
2463
              name: _this15._getParamName(0),
2464
              data: _transformedFile.webkitSlice ? _transformedFile.webkitSlice(start, end) : _transformedFile.slice(start, end),
2465
              filename: file.upload.filename,
2466
              chunkIndex: chunkIndex
2467
            };
2468
            file.upload.chunks[chunkIndex] = {
2469
              file: file,
2470
              index: chunkIndex,
2471
              dataBlock: dataBlock,
2472
              // In case we want to retry.
2473
              status: Dropzone.UPLOADING,
2474
              progress: 0,
2475
              retries: 0 // The number of times this block has been retried.
2476
2477
            };
2478
2479
            _this15._uploadData(files, [dataBlock]);
2480
          };
2481
2482
          file.upload.finishedChunkUpload = function (chunk) {
2483
            var allFinished = true;
2484
            chunk.status = Dropzone.SUCCESS; // Clear the data from the chunk
2485
2486
            chunk.dataBlock = null; // Leaving this reference to xhr intact here will cause memory leaks in some browsers
2487
2488
            chunk.xhr = null;
2489
2490
            for (var i = 0; i < file.upload.totalChunkCount; i++) {
2491
              if (file.upload.chunks[i] === undefined) {
2492
                return handleNextChunk();
2493
              }
2494
2495
              if (file.upload.chunks[i].status !== Dropzone.SUCCESS) {
2496
                allFinished = false;
2497
              }
2498
            }
2499
2500
            if (allFinished) {
2501
              _this15.options.chunksUploaded(file, function () {
2502
                _this15._finished(files, '', null);
2503
              });
0 ignored issues
show
Best Practice introduced by
There is no return statement in this branch, but you do return something in other branches. Did you maybe miss it? If you do not want to return anything, consider adding return undefined; explicitly.
Loading history...
2504
            }
2505
          };
2506
2507
          if (_this15.options.parallelChunkUploads) {
2508
            for (var i = 0; i < file.upload.totalChunkCount; i++) {
2509
              handleNextChunk();
2510
            }
2511
          } else {
2512
            handleNextChunk();
2513
          }
2514
        } else {
2515
          var dataBlocks = [];
2516
2517
          for (var _i3 = 0; _i3 < files.length; _i3++) {
2518
            dataBlocks[_i3] = {
2519
              name: _this15._getParamName(_i3),
2520
              data: transformedFiles[_i3],
2521
              filename: files[_i3].upload.filename
2522
            };
2523
          }
2524
2525
          _this15._uploadData(files, dataBlocks);
2526
        }
2527
      });
2528
    } /// Returns the right chunk for given file and xhr
2529
2530
  }, {
2531
    key: "_getChunk",
2532
    value: function _getChunk(file, xhr) {
2533
      for (var i = 0; i < file.upload.totalChunkCount; i++) {
2534
        if (file.upload.chunks[i] !== undefined && file.upload.chunks[i].xhr === xhr) {
2535
          return file.upload.chunks[i];
2536
        }
2537
      }
0 ignored issues
show
Best Practice introduced by
There is no return statement in this branch, but you do return something in other branches. Did you maybe miss it? If you do not want to return anything, consider adding return undefined; explicitly.
Loading history...
2538
    } // This function actually uploads the file(s) to the server.
2539
    // If dataBlocks contains the actual data to upload (meaning, that this could either be transformed
2540
    // files, or individual chunks for chunked upload).
2541
2542
  }, {
2543
    key: "_uploadData",
2544
    value: function _uploadData(files, dataBlocks) {
2545
      var _this16 = this;
2546
2547
      var xhr = new XMLHttpRequest(); // Put the xhr object in the file objects to be able to reference it later.
2548
2549
      var _iteratorNormalCompletion21 = true;
2550
      var _didIteratorError21 = false;
2551
      var _iteratorError21 = undefined;
0 ignored issues
show
Unused Code Comprehensibility introduced by
The assignment of undefined is not necessary as _iteratorError21 is implicitly marked as undefined by the declaration.
Loading history...
2552
2553
      try {
2554
        for (var _iterator21 = files[Symbol.iterator](), _step21; !(_iteratorNormalCompletion21 = (_step21 = _iterator21.next()).done); _iteratorNormalCompletion21 = true) {
2555
          var file = _step21.value;
2556
          file.xhr = xhr;
2557
        }
2558
      } catch (err) {
2559
        _didIteratorError21 = true;
2560
        _iteratorError21 = err;
2561
      } finally {
2562
        try {
2563
          if (!_iteratorNormalCompletion21 && _iterator21["return"] != null) {
2564
            _iterator21["return"]();
2565
          }
2566
        } finally {
2567
          if (_didIteratorError21) {
2568
            throw _iteratorError21;
0 ignored issues
show
Comprehensibility Bug introduced by
Usage of the throw statement in a finally clause is discouraged. This construct may mask errors and makes debugging difficult.
Loading history...
2569
          }
2570
        }
2571
      }
2572
2573
      if (files[0].upload.chunked) {
2574
        // Put the xhr object in the right chunk object, so it can be associated later, and found with _getChunk
2575
        files[0].upload.chunks[dataBlocks[0].chunkIndex].xhr = xhr;
2576
      }
2577
2578
      var method = this.resolveOption(this.options.method, files);
2579
      var url = this.resolveOption(this.options.url, files);
2580
      xhr.open(method, url, true); // Setting the timeout after open because of IE11 issue: https://gitlab.com/meno/dropzone/issues/8
2581
2582
      xhr.timeout = this.resolveOption(this.options.timeout, files); // Has to be after `.open()`. See https://github.com/enyo/dropzone/issues/179
2583
2584
      xhr.withCredentials = !!this.options.withCredentials;
2585
2586
      xhr.onload = function (e) {
2587
        _this16._finishedUploading(files, xhr, e);
2588
      };
2589
2590
      xhr.ontimeout = function () {
2591
        _this16._handleUploadError(files, xhr, "Request timedout after ".concat(_this16.options.timeout, " seconds"));
2592
      };
2593
2594
      xhr.onerror = function () {
2595
        _this16._handleUploadError(files, xhr);
2596
      }; // Some browsers do not have the .upload property
2597
2598
2599
      var progressObj = xhr.upload != null ? xhr.upload : xhr;
2600
2601
      progressObj.onprogress = function (e) {
2602
        return _this16._updateFilesUploadProgress(files, xhr, e);
2603
      };
2604
2605
      var headers = {
2606
        "Accept": "application/json",
2607
        "Cache-Control": "no-cache",
2608
        "X-Requested-With": "XMLHttpRequest"
2609
      };
2610
2611
      if (this.options.headers) {
2612
        Dropzone.extend(headers, this.options.headers);
2613
      }
2614
2615
      for (var headerName in headers) {
0 ignored issues
show
Complexity introduced by
A for in loop automatically includes the property of any prototype object, consider checking the key using hasOwnProperty.

When iterating over the keys of an object, this includes not only the keys of the object, but also keys contained in the prototype of that object. It is generally a best practice to check for these keys specifically:

var someObject;
for (var key in someObject) {
    if ( ! someObject.hasOwnProperty(key)) {
        continue; // Skip keys from the prototype.
    }

    doSomethingWith(key);
}
Loading history...
2616
        var headerValue = headers[headerName];
2617
2618
        if (headerValue) {
2619
          xhr.setRequestHeader(headerName, headerValue);
2620
        }
2621
      }
2622
2623
      var formData = new FormData(); // Adding all @options parameters
2624
2625
      if (this.options.params) {
2626
        var additionalParams = this.options.params;
2627
2628
        if (typeof additionalParams === 'function') {
2629
          additionalParams = additionalParams.call(this, files, xhr, files[0].upload.chunked ? this._getChunk(files[0], xhr) : null);
2630
        }
2631
2632
        for (var key in additionalParams) {
0 ignored issues
show
Complexity introduced by
A for in loop automatically includes the property of any prototype object, consider checking the key using hasOwnProperty.

When iterating over the keys of an object, this includes not only the keys of the object, but also keys contained in the prototype of that object. It is generally a best practice to check for these keys specifically:

var someObject;
for (var key in someObject) {
    if ( ! someObject.hasOwnProperty(key)) {
        continue; // Skip keys from the prototype.
    }

    doSomethingWith(key);
}
Loading history...
2633
          var value = additionalParams[key];
2634
          formData.append(key, value);
2635
        }
2636
      } // Let the user add additional data if necessary
2637
2638
2639
      var _iteratorNormalCompletion22 = true;
2640
      var _didIteratorError22 = false;
2641
      var _iteratorError22 = undefined;
0 ignored issues
show
Unused Code Comprehensibility introduced by
The assignment of undefined is not necessary as _iteratorError22 is implicitly marked as undefined by the declaration.
Loading history...
2642
2643
      try {
2644
        for (var _iterator22 = files[Symbol.iterator](), _step22; !(_iteratorNormalCompletion22 = (_step22 = _iterator22.next()).done); _iteratorNormalCompletion22 = true) {
2645
          var _file = _step22.value;
2646
          this.emit("sending", _file, xhr, formData);
2647
        }
2648
      } catch (err) {
2649
        _didIteratorError22 = true;
2650
        _iteratorError22 = err;
2651
      } finally {
2652
        try {
2653
          if (!_iteratorNormalCompletion22 && _iterator22["return"] != null) {
2654
            _iterator22["return"]();
2655
          }
2656
        } finally {
2657
          if (_didIteratorError22) {
2658
            throw _iteratorError22;
0 ignored issues
show
Comprehensibility Bug introduced by
Usage of the throw statement in a finally clause is discouraged. This construct may mask errors and makes debugging difficult.
Loading history...
2659
          }
2660
        }
2661
      }
2662
2663
      if (this.options.uploadMultiple) {
2664
        this.emit("sendingmultiple", files, xhr, formData);
2665
      }
2666
2667
      this._addFormElementData(formData); // Finally add the files
2668
      // Has to be last because some servers (eg: S3) expect the file to be the last parameter
2669
2670
2671
      for (var i = 0; i < dataBlocks.length; i++) {
2672
        var dataBlock = dataBlocks[i];
2673
        formData.append(dataBlock.name, dataBlock.data, dataBlock.filename);
2674
      }
2675
2676
      this.submitRequest(xhr, formData, files);
2677
    } // Transforms all files with this.options.transformFile and invokes done with the transformed files when done.
2678
2679
  }, {
2680
    key: "_transformFiles",
2681
    value: function _transformFiles(files, done) {
2682
      var _this17 = this;
2683
2684
      var transformedFiles = []; // Clumsy way of handling asynchronous calls, until I get to add a proper Future library.
2685
2686
      var doneCounter = 0;
2687
2688
      var _loop = function _loop(i) {
2689
        _this17.options.transformFile.call(_this17, files[i], function (transformedFile) {
2690
          transformedFiles[i] = transformedFile;
2691
2692
          if (++doneCounter === files.length) {
2693
            done(transformedFiles);
2694
          }
2695
        });
2696
      };
2697
2698
      for (var i = 0; i < files.length; i++) {
2699
        _loop(i);
2700
      }
2701
    } // Takes care of adding other input elements of the form to the AJAX request
2702
2703
  }, {
2704
    key: "_addFormElementData",
2705
    value: function _addFormElementData(formData) {
2706
      // Take care of other input elements
2707
      if (this.element.tagName === "FORM") {
2708
        var _iteratorNormalCompletion23 = true;
2709
        var _didIteratorError23 = false;
2710
        var _iteratorError23 = undefined;
0 ignored issues
show
Unused Code Comprehensibility introduced by
The assignment of undefined is not necessary as _iteratorError23 is implicitly marked as undefined by the declaration.
Loading history...
2711
2712
        try {
2713
          for (var _iterator23 = this.element.querySelectorAll("input, textarea, select, button")[Symbol.iterator](), _step23; !(_iteratorNormalCompletion23 = (_step23 = _iterator23.next()).done); _iteratorNormalCompletion23 = true) {
2714
            var input = _step23.value;
2715
            var inputName = input.getAttribute("name");
2716
            var inputType = input.getAttribute("type");
2717
            if (inputType) inputType = inputType.toLowerCase(); // If the input doesn't have a name, we can't use it.
2718
2719
            if (typeof inputName === 'undefined' || inputName === null) continue;
2720
2721
            if (input.tagName === "SELECT" && input.hasAttribute("multiple")) {
2722
              // Possibly multiple values
2723
              var _iteratorNormalCompletion24 = true;
2724
              var _didIteratorError24 = false;
2725
              var _iteratorError24 = undefined;
0 ignored issues
show
Unused Code Comprehensibility introduced by
The assignment of undefined is not necessary as _iteratorError24 is implicitly marked as undefined by the declaration.
Loading history...
2726
2727
              try {
2728
                for (var _iterator24 = input.options[Symbol.iterator](), _step24; !(_iteratorNormalCompletion24 = (_step24 = _iterator24.next()).done); _iteratorNormalCompletion24 = true) {
2729
                  var option = _step24.value;
2730
2731
                  if (option.selected) {
2732
                    formData.append(inputName, option.value);
2733
                  }
2734
                }
2735
              } catch (err) {
2736
                _didIteratorError24 = true;
2737
                _iteratorError24 = err;
2738
              } finally {
2739
                try {
2740
                  if (!_iteratorNormalCompletion24 && _iterator24["return"] != null) {
2741
                    _iterator24["return"]();
2742
                  }
2743
                } finally {
2744
                  if (_didIteratorError24) {
2745
                    throw _iteratorError24;
2746
                  }
2747
                }
2748
              }
2749
            } else if (!inputType || inputType !== "checkbox" && inputType !== "radio" || input.checked) {
2750
              formData.append(inputName, input.value);
2751
            }
2752
          }
2753
        } catch (err) {
2754
          _didIteratorError23 = true;
2755
          _iteratorError23 = err;
2756
        } finally {
2757
          try {
2758
            if (!_iteratorNormalCompletion23 && _iterator23["return"] != null) {
2759
              _iterator23["return"]();
2760
            }
2761
          } finally {
2762
            if (_didIteratorError23) {
2763
              throw _iteratorError23;
0 ignored issues
show
Comprehensibility Bug introduced by
Usage of the throw statement in a finally clause is discouraged. This construct may mask errors and makes debugging difficult.
Loading history...
2764
            }
2765
          }
2766
        }
2767
      }
2768
    } // Invoked when there is new progress information about given files.
2769
    // If e is not provided, it is assumed that the upload is finished.
2770
2771
  }, {
2772
    key: "_updateFilesUploadProgress",
2773
    value: function _updateFilesUploadProgress(files, xhr, e) {
2774
      var progress;
2775
2776
      if (typeof e !== 'undefined') {
2777
        progress = 100 * e.loaded / e.total;
2778
2779
        if (files[0].upload.chunked) {
2780
          var file = files[0]; // Since this is a chunked upload, we need to update the appropriate chunk progress.
2781
2782
          var chunk = this._getChunk(file, xhr);
2783
2784
          chunk.progress = progress;
2785
          chunk.total = e.total;
2786
          chunk.bytesSent = e.loaded;
2787
          var fileProgress = 0,
0 ignored issues
show
Unused Code introduced by
The variable fileProgress seems to be never used. Consider removing it.
Loading history...
2788
              fileTotal,
0 ignored issues
show
Unused Code introduced by
The variable fileTotal seems to be never used. Consider removing it.
Loading history...
2789
              fileBytesSent;
0 ignored issues
show
Unused Code introduced by
The variable fileBytesSent seems to be never used. Consider removing it.
Loading history...
2790
          file.upload.progress = 0;
2791
          file.upload.total = 0;
2792
          file.upload.bytesSent = 0;
2793
2794
          for (var i = 0; i < file.upload.totalChunkCount; i++) {
2795
            if (file.upload.chunks[i] !== undefined && file.upload.chunks[i].progress !== undefined) {
2796
              file.upload.progress += file.upload.chunks[i].progress;
2797
              file.upload.total += file.upload.chunks[i].total;
2798
              file.upload.bytesSent += file.upload.chunks[i].bytesSent;
2799
            }
2800
          }
2801
2802
          file.upload.progress = file.upload.progress / file.upload.totalChunkCount;
2803
        } else {
2804
          var _iteratorNormalCompletion25 = true;
2805
          var _didIteratorError25 = false;
2806
          var _iteratorError25 = undefined;
0 ignored issues
show
Unused Code Comprehensibility introduced by
The assignment of undefined is not necessary as _iteratorError25 is implicitly marked as undefined by the declaration.
Loading history...
2807
2808
          try {
2809
            for (var _iterator25 = files[Symbol.iterator](), _step25; !(_iteratorNormalCompletion25 = (_step25 = _iterator25.next()).done); _iteratorNormalCompletion25 = true) {
2810
              var _file2 = _step25.value;
2811
              _file2.upload.progress = progress;
2812
              _file2.upload.total = e.total;
2813
              _file2.upload.bytesSent = e.loaded;
2814
            }
2815
          } catch (err) {
2816
            _didIteratorError25 = true;
2817
            _iteratorError25 = err;
2818
          } finally {
2819
            try {
2820
              if (!_iteratorNormalCompletion25 && _iterator25["return"] != null) {
2821
                _iterator25["return"]();
2822
              }
2823
            } finally {
2824
              if (_didIteratorError25) {
2825
                throw _iteratorError25;
0 ignored issues
show
Comprehensibility Bug introduced by
Usage of the throw statement in a finally clause is discouraged. This construct may mask errors and makes debugging difficult.
Loading history...
2826
              }
2827
            }
2828
          }
2829
        }
2830
2831
        var _iteratorNormalCompletion26 = true;
2832
        var _didIteratorError26 = false;
2833
        var _iteratorError26 = undefined;
0 ignored issues
show
Unused Code Comprehensibility introduced by
The assignment of undefined is not necessary as _iteratorError26 is implicitly marked as undefined by the declaration.
Loading history...
2834
2835
        try {
2836
          for (var _iterator26 = files[Symbol.iterator](), _step26; !(_iteratorNormalCompletion26 = (_step26 = _iterator26.next()).done); _iteratorNormalCompletion26 = true) {
2837
            var _file3 = _step26.value;
2838
            this.emit("uploadprogress", _file3, _file3.upload.progress, _file3.upload.bytesSent);
2839
          }
2840
        } catch (err) {
2841
          _didIteratorError26 = true;
2842
          _iteratorError26 = err;
2843
        } finally {
2844
          try {
2845
            if (!_iteratorNormalCompletion26 && _iterator26["return"] != null) {
2846
              _iterator26["return"]();
2847
            }
2848
          } finally {
2849
            if (_didIteratorError26) {
2850
              throw _iteratorError26;
0 ignored issues
show
Comprehensibility Bug introduced by
Usage of the throw statement in a finally clause is discouraged. This construct may mask errors and makes debugging difficult.
Loading history...
2851
            }
2852
          }
2853
        }
2854
      } else {
2855
        // Called when the file finished uploading
2856
        var allFilesFinished = true;
2857
        progress = 100;
2858
        var _iteratorNormalCompletion27 = true;
2859
        var _didIteratorError27 = false;
2860
        var _iteratorError27 = undefined;
0 ignored issues
show
Unused Code Comprehensibility introduced by
The assignment of undefined is not necessary as _iteratorError27 is implicitly marked as undefined by the declaration.
Loading history...
2861
2862
        try {
2863
          for (var _iterator27 = files[Symbol.iterator](), _step27; !(_iteratorNormalCompletion27 = (_step27 = _iterator27.next()).done); _iteratorNormalCompletion27 = true) {
2864
            var _file4 = _step27.value;
2865
2866
            if (_file4.upload.progress !== 100 || _file4.upload.bytesSent !== _file4.upload.total) {
2867
              allFilesFinished = false;
2868
            }
2869
2870
            _file4.upload.progress = progress;
2871
            _file4.upload.bytesSent = _file4.upload.total;
2872
          } // Nothing to do, all files already at 100%
2873
2874
        } catch (err) {
2875
          _didIteratorError27 = true;
2876
          _iteratorError27 = err;
2877
        } finally {
2878
          try {
2879
            if (!_iteratorNormalCompletion27 && _iterator27["return"] != null) {
2880
              _iterator27["return"]();
2881
            }
2882
          } finally {
2883
            if (_didIteratorError27) {
2884
              throw _iteratorError27;
0 ignored issues
show
Comprehensibility Bug introduced by
Usage of the throw statement in a finally clause is discouraged. This construct may mask errors and makes debugging difficult.
Loading history...
2885
            }
2886
          }
2887
        }
2888
2889
        if (allFilesFinished) {
2890
          return;
2891
        }
2892
2893
        var _iteratorNormalCompletion28 = true;
2894
        var _didIteratorError28 = false;
2895
        var _iteratorError28 = undefined;
0 ignored issues
show
Unused Code Comprehensibility introduced by
The assignment of undefined is not necessary as _iteratorError28 is implicitly marked as undefined by the declaration.
Loading history...
2896
2897
        try {
2898
          for (var _iterator28 = files[Symbol.iterator](), _step28; !(_iteratorNormalCompletion28 = (_step28 = _iterator28.next()).done); _iteratorNormalCompletion28 = true) {
2899
            var _file5 = _step28.value;
2900
            this.emit("uploadprogress", _file5, progress, _file5.upload.bytesSent);
2901
          }
2902
        } catch (err) {
2903
          _didIteratorError28 = true;
2904
          _iteratorError28 = err;
2905
        } finally {
2906
          try {
2907
            if (!_iteratorNormalCompletion28 && _iterator28["return"] != null) {
2908
              _iterator28["return"]();
2909
            }
2910
          } finally {
2911
            if (_didIteratorError28) {
2912
              throw _iteratorError28;
0 ignored issues
show
Comprehensibility Bug introduced by
Usage of the throw statement in a finally clause is discouraged. This construct may mask errors and makes debugging difficult.
Loading history...
2913
            }
2914
          }
2915
        }
2916
      }
2917
    }
2918
  }, {
2919
    key: "_finishedUploading",
2920
    value: function _finishedUploading(files, xhr, e) {
2921
      var response;
2922
2923
      if (files[0].status === Dropzone.CANCELED) {
2924
        return;
2925
      }
2926
2927
      if (xhr.readyState !== 4) {
2928
        return;
2929
      }
2930
2931
      if (xhr.responseType !== 'arraybuffer' && xhr.responseType !== 'blob') {
2932
        response = xhr.responseText;
2933
2934
        if (xhr.getResponseHeader("content-type") && ~xhr.getResponseHeader("content-type").indexOf("application/json")) {
2935
          try {
2936
            response = JSON.parse(response);
2937
          } catch (error) {
2938
            e = error;
2939
            response = "Invalid JSON response from server.";
2940
          }
2941
        }
2942
      }
2943
2944
      this._updateFilesUploadProgress(files);
2945
2946
      if (!(200 <= xhr.status && xhr.status < 300)) {
2947
        this._handleUploadError(files, xhr, response);
0 ignored issues
show
Bug introduced by
The variable response does not seem to be initialized in case xhr.responseType !== "ar...responseType !== "blob" on line 2931 is false. Are you sure the function _handleUploadError handles undefined variables?
Loading history...
2948
      } else {
2949
        if (files[0].upload.chunked) {
2950
          files[0].upload.finishedChunkUpload(this._getChunk(files[0], xhr));
2951
        } else {
2952
          this._finished(files, response, e);
2953
        }
2954
      }
2955
    }
2956
  }, {
2957
    key: "_handleUploadError",
2958
    value: function _handleUploadError(files, xhr, response) {
2959
      if (files[0].status === Dropzone.CANCELED) {
2960
        return;
2961
      }
2962
2963
      if (files[0].upload.chunked && this.options.retryChunks) {
2964
        var chunk = this._getChunk(files[0], xhr);
2965
2966
        if (chunk.retries++ < this.options.retryChunksLimit) {
2967
          this._uploadData(files, [chunk.dataBlock]);
2968
2969
          return;
2970
        } else {
2971
          console.warn('Retried this chunk too often. Giving up.');
2972
        }
2973
      }
2974
2975
      this._errorProcessing(files, response || this.options.dictResponseError.replace("{{statusCode}}", xhr.status), xhr);
2976
    }
2977
  }, {
2978
    key: "submitRequest",
2979
    value: function submitRequest(xhr, formData, files) {
2980
      xhr.send(formData);
2981
    } // Called internally when processing is finished.
2982
    // Individual callbacks have to be called in the appropriate sections.
2983
2984
  }, {
2985
    key: "_finished",
2986
    value: function _finished(files, responseText, e) {
2987
      var _iteratorNormalCompletion29 = true;
2988
      var _didIteratorError29 = false;
2989
      var _iteratorError29 = undefined;
0 ignored issues
show
Unused Code Comprehensibility introduced by
The assignment of undefined is not necessary as _iteratorError29 is implicitly marked as undefined by the declaration.
Loading history...
2990
2991
      try {
2992
        for (var _iterator29 = files[Symbol.iterator](), _step29; !(_iteratorNormalCompletion29 = (_step29 = _iterator29.next()).done); _iteratorNormalCompletion29 = true) {
2993
          var file = _step29.value;
2994
          file.status = Dropzone.SUCCESS;
2995
          this.emit("success", file, responseText, e);
2996
          this.emit("complete", file);
2997
        }
2998
      } catch (err) {
2999
        _didIteratorError29 = true;
3000
        _iteratorError29 = err;
3001
      } finally {
3002
        try {
3003
          if (!_iteratorNormalCompletion29 && _iterator29["return"] != null) {
3004
            _iterator29["return"]();
3005
          }
3006
        } finally {
3007
          if (_didIteratorError29) {
3008
            throw _iteratorError29;
0 ignored issues
show
Comprehensibility Bug introduced by
Usage of the throw statement in a finally clause is discouraged. This construct may mask errors and makes debugging difficult.
Loading history...
3009
          }
3010
        }
3011
      }
3012
3013
      if (this.options.uploadMultiple) {
3014
        this.emit("successmultiple", files, responseText, e);
3015
        this.emit("completemultiple", files);
3016
      }
3017
3018
      if (this.options.autoProcessQueue) {
3019
        return this.processQueue();
3020
      }
3021
    } // Called internally when processing is finished.
3022
    // Individual callbacks have to be called in the appropriate sections.
3023
3024
  }, {
3025
    key: "_errorProcessing",
3026
    value: function _errorProcessing(files, message, xhr) {
3027
      var _iteratorNormalCompletion30 = true;
3028
      var _didIteratorError30 = false;
3029
      var _iteratorError30 = undefined;
0 ignored issues
show
Unused Code Comprehensibility introduced by
The assignment of undefined is not necessary as _iteratorError30 is implicitly marked as undefined by the declaration.
Loading history...
3030
3031
      try {
3032
        for (var _iterator30 = files[Symbol.iterator](), _step30; !(_iteratorNormalCompletion30 = (_step30 = _iterator30.next()).done); _iteratorNormalCompletion30 = true) {
3033
          var file = _step30.value;
3034
          file.status = Dropzone.ERROR;
3035
          this.emit("error", file, message, xhr);
3036
          this.emit("complete", file);
3037
        }
3038
      } catch (err) {
3039
        _didIteratorError30 = true;
3040
        _iteratorError30 = err;
3041
      } finally {
3042
        try {
3043
          if (!_iteratorNormalCompletion30 && _iterator30["return"] != null) {
3044
            _iterator30["return"]();
3045
          }
3046
        } finally {
3047
          if (_didIteratorError30) {
3048
            throw _iteratorError30;
0 ignored issues
show
Comprehensibility Bug introduced by
Usage of the throw statement in a finally clause is discouraged. This construct may mask errors and makes debugging difficult.
Loading history...
3049
          }
3050
        }
3051
      }
3052
3053
      if (this.options.uploadMultiple) {
3054
        this.emit("errormultiple", files, message, xhr);
3055
        this.emit("completemultiple", files);
3056
      }
3057
3058
      if (this.options.autoProcessQueue) {
3059
        return this.processQueue();
3060
      }
3061
    }
3062
  }], [{
3063
    key: "uuidv4",
3064
    value: function uuidv4() {
3065
      return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
3066
        var r = Math.random() * 16 | 0,
3067
            v = c === 'x' ? r : r & 0x3 | 0x8;
3068
        return v.toString(16);
3069
      });
3070
    }
3071
  }]);
3072
3073
  return Dropzone;
3074
}(Emitter);
3075
3076
Dropzone.initClass();
3077
Dropzone.version = "5.7.0"; // This is a map of options for your different dropzones. Add configurations
3078
// to this object for your different dropzone elemens.
3079
//
3080
// Example:
3081
//
3082
//     Dropzone.options.myDropzoneElementId = { maxFilesize: 1 };
3083
//
3084
// To disable autoDiscover for a specific element, you can set `false` as an option:
3085
//
3086
//     Dropzone.options.myDisabledElementId = false;
3087
//
3088
// And in html:
3089
//
3090
//     <form action="/upload" id="my-dropzone-element-id" class="dropzone"></form>
3091
3092
Dropzone.options = {}; // Returns the options for an element or undefined if none available.
3093
3094
Dropzone.optionsForElement = function (element) {
3095
  // Get the `Dropzone.options.elementId` for this element if it exists
3096
  if (element.getAttribute("id")) {
3097
    return Dropzone.options[camelize(element.getAttribute("id"))];
3098
  } else {
3099
    return undefined;
3100
  }
3101
}; // Holds a list of all dropzone instances
3102
3103
3104
Dropzone.instances = []; // Returns the dropzone for given element if any
3105
3106
Dropzone.forElement = function (element) {
3107
  if (typeof element === "string") {
3108
    element = document.querySelector(element);
3109
  }
3110
3111
  if ((element != null ? element.dropzone : undefined) == null) {
3112
    throw new Error("No Dropzone found for given element. This is probably because you're trying to access it before Dropzone had the time to initialize. Use the `init` option to setup any additional observers on your Dropzone.");
3113
  }
3114
3115
  return element.dropzone;
3116
}; // Set to false if you don't want Dropzone to automatically find and attach to .dropzone elements.
3117
3118
3119
Dropzone.autoDiscover = true; // Looks for all .dropzone elements and creates a dropzone for them
3120
3121
Dropzone.discover = function () {
3122
  var dropzones;
3123
3124
  if (document.querySelectorAll) {
3125
    dropzones = document.querySelectorAll(".dropzone");
3126
  } else {
3127
    dropzones = []; // IE :(
3128
3129
    var checkElements = function checkElements(elements) {
3130
      return function () {
3131
        var result = [];
3132
        var _iteratorNormalCompletion31 = true;
3133
        var _didIteratorError31 = false;
3134
        var _iteratorError31 = undefined;
0 ignored issues
show
Unused Code Comprehensibility introduced by
The assignment of undefined is not necessary as _iteratorError31 is implicitly marked as undefined by the declaration.
Loading history...
3135
3136
        try {
3137
          for (var _iterator31 = elements[Symbol.iterator](), _step31; !(_iteratorNormalCompletion31 = (_step31 = _iterator31.next()).done); _iteratorNormalCompletion31 = true) {
3138
            var el = _step31.value;
3139
3140
            if (/(^| )dropzone($| )/.test(el.className)) {
3141
              result.push(dropzones.push(el));
3142
            } else {
3143
              result.push(undefined);
3144
            }
3145
          }
3146
        } catch (err) {
3147
          _didIteratorError31 = true;
3148
          _iteratorError31 = err;
3149
        } finally {
3150
          try {
3151
            if (!_iteratorNormalCompletion31 && _iterator31["return"] != null) {
3152
              _iterator31["return"]();
3153
            }
3154
          } finally {
3155
            if (_didIteratorError31) {
3156
              throw _iteratorError31;
0 ignored issues
show
Comprehensibility Bug introduced by
Usage of the throw statement in a finally clause is discouraged. This construct may mask errors and makes debugging difficult.
Loading history...
3157
            }
3158
          }
3159
        }
3160
3161
        return result;
3162
      }();
3163
    };
3164
3165
    checkElements(document.getElementsByTagName("div"));
3166
    checkElements(document.getElementsByTagName("form"));
3167
  }
3168
3169
  return function () {
3170
    var result = [];
3171
    var _iteratorNormalCompletion32 = true;
3172
    var _didIteratorError32 = false;
3173
    var _iteratorError32 = undefined;
0 ignored issues
show
Unused Code Comprehensibility introduced by
The assignment of undefined is not necessary as _iteratorError32 is implicitly marked as undefined by the declaration.
Loading history...
3174
3175
    try {
3176
      for (var _iterator32 = dropzones[Symbol.iterator](), _step32; !(_iteratorNormalCompletion32 = (_step32 = _iterator32.next()).done); _iteratorNormalCompletion32 = true) {
3177
        var dropzone = _step32.value;
3178
3179
        // Create a dropzone unless auto discover has been disabled for specific element
3180
        if (Dropzone.optionsForElement(dropzone) !== false) {
3181
          result.push(new Dropzone(dropzone));
3182
        } else {
3183
          result.push(undefined);
3184
        }
3185
      }
3186
    } catch (err) {
3187
      _didIteratorError32 = true;
3188
      _iteratorError32 = err;
3189
    } finally {
3190
      try {
3191
        if (!_iteratorNormalCompletion32 && _iterator32["return"] != null) {
3192
          _iterator32["return"]();
3193
        }
3194
      } finally {
3195
        if (_didIteratorError32) {
3196
          throw _iteratorError32;
0 ignored issues
show
Comprehensibility Bug introduced by
Usage of the throw statement in a finally clause is discouraged. This construct may mask errors and makes debugging difficult.
Loading history...
3197
        }
3198
      }
3199
    }
3200
3201
    return result;
3202
  }();
3203
}; // Since the whole Drag'n'Drop API is pretty new, some browsers implement it,
3204
// but not correctly.
3205
// So I created a blacklist of userAgents. Yes, yes. Browser sniffing, I know.
3206
// But what to do when browsers *theoretically* support an API, but crash
3207
// when using it.
3208
//
3209
// This is a list of regular expressions tested against navigator.userAgent
3210
//
3211
// ** It should only be used on browser that *do* support the API, but
3212
// incorrectly **
3213
//
3214
3215
3216
Dropzone.blacklistedBrowsers = [// The mac os and windows phone version of opera 12 seems to have a problem with the File drag'n'drop API.
3217
/opera.*(Macintosh|Windows Phone).*version\/12/i]; // Checks if the browser is supported
3218
3219
Dropzone.isBrowserSupported = function () {
3220
  var capableBrowser = true;
3221
3222
  if (window.File && window.FileReader && window.FileList && window.Blob && window.FormData && document.querySelector) {
3223
    if (!("classList" in document.createElement("a"))) {
3224
      capableBrowser = false;
3225
    } else {
3226
      // The browser supports the API, but may be blacklisted.
3227
      var _iteratorNormalCompletion33 = true;
3228
      var _didIteratorError33 = false;
3229
      var _iteratorError33 = undefined;
0 ignored issues
show
Unused Code Comprehensibility introduced by
The assignment of undefined is not necessary as _iteratorError33 is implicitly marked as undefined by the declaration.
Loading history...
3230
3231
      try {
3232
        for (var _iterator33 = Dropzone.blacklistedBrowsers[Symbol.iterator](), _step33; !(_iteratorNormalCompletion33 = (_step33 = _iterator33.next()).done); _iteratorNormalCompletion33 = true) {
3233
          var regex = _step33.value;
3234
3235
          if (regex.test(navigator.userAgent)) {
3236
            capableBrowser = false;
3237
            continue;
0 ignored issues
show
Unused Code introduced by
This continue has no effect on the loop flow and can be removed.
Loading history...
3238
          }
3239
        }
3240
      } catch (err) {
3241
        _didIteratorError33 = true;
3242
        _iteratorError33 = err;
3243
      } finally {
3244
        try {
3245
          if (!_iteratorNormalCompletion33 && _iterator33["return"] != null) {
3246
            _iterator33["return"]();
3247
          }
3248
        } finally {
3249
          if (_didIteratorError33) {
3250
            throw _iteratorError33;
0 ignored issues
show
Comprehensibility Bug introduced by
Usage of the throw statement in a finally clause is discouraged. This construct may mask errors and makes debugging difficult.
Loading history...
3251
          }
3252
        }
3253
      }
3254
    }
3255
  } else {
3256
    capableBrowser = false;
3257
  }
3258
3259
  return capableBrowser;
3260
};
3261
3262
Dropzone.dataURItoBlob = function (dataURI) {
3263
  // convert base64 to raw binary data held in a string
3264
  // doesn't handle URLEncoded DataURIs - see SO answer #6850276 for code that does this
3265
  var byteString = atob(dataURI.split(',')[1]); // separate out the mime component
3266
3267
  var mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0]; // write the bytes of the string to an ArrayBuffer
3268
3269
  var ab = new ArrayBuffer(byteString.length);
3270
  var ia = new Uint8Array(ab);
3271
3272
  for (var i = 0, end = byteString.length, asc = 0 <= end; asc ? i <= end : i >= end; asc ? i++ : i--) {
3273
    ia[i] = byteString.charCodeAt(i);
3274
  } // write the ArrayBuffer to a blob
3275
3276
3277
  return new Blob([ab], {
3278
    type: mimeString
3279
  });
3280
}; // Returns an array without the rejected item
3281
3282
3283
var without = function without(list, rejectedItem) {
3284
  return list.filter(function (item) {
3285
    return item !== rejectedItem;
3286
  }).map(function (item) {
3287
    return item;
3288
  });
3289
}; // abc-def_ghi -> abcDefGhi
3290
3291
3292
var camelize = function camelize(str) {
3293
  return str.replace(/[\-_](\w)/g, function (match) {
3294
    return match.charAt(1).toUpperCase();
3295
  });
3296
}; // Creates an element from string
3297
3298
3299
Dropzone.createElement = function (string) {
3300
  var div = document.createElement("div");
3301
  div.innerHTML = string;
3302
  return div.childNodes[0];
3303
}; // Tests if given element is inside (or simply is) the container
3304
3305
3306
Dropzone.elementInside = function (element, container) {
3307
  if (element === container) {
3308
    return true;
3309
  } // Coffeescript doesn't support do/while loops
3310
3311
3312
  while (element = element.parentNode) {
3313
    if (element === container) {
3314
      return true;
3315
    }
3316
  }
3317
3318
  return false;
3319
};
3320
3321
Dropzone.getElement = function (el, name) {
3322
  var element;
3323
3324
  if (typeof el === "string") {
3325
    element = document.querySelector(el);
3326
  } else if (el.nodeType != null) {
3327
    element = el;
3328
  }
3329
3330
  if (element == null) {
0 ignored issues
show
Bug introduced by
The variable element does not seem to be initialized in case el.nodeType != null on line 3326 is false. Are you sure this can never be the case?
Loading history...
3331
    throw new Error("Invalid `".concat(name, "` option provided. Please provide a CSS selector or a plain HTML element."));
3332
  }
3333
3334
  return element;
3335
};
3336
3337
Dropzone.getElements = function (els, name) {
3338
  var el, elements;
3339
3340
  if (els instanceof Array) {
3341
    elements = [];
3342
3343
    try {
3344
      var _iteratorNormalCompletion34 = true;
3345
      var _didIteratorError34 = false;
3346
      var _iteratorError34 = undefined;
0 ignored issues
show
Unused Code Comprehensibility introduced by
The assignment of undefined is not necessary as _iteratorError34 is implicitly marked as undefined by the declaration.
Loading history...
3347
3348
      try {
3349
        for (var _iterator34 = els[Symbol.iterator](), _step34; !(_iteratorNormalCompletion34 = (_step34 = _iterator34.next()).done); _iteratorNormalCompletion34 = true) {
3350
          el = _step34.value;
3351
          elements.push(this.getElement(el, name));
3352
        }
3353
      } catch (err) {
3354
        _didIteratorError34 = true;
3355
        _iteratorError34 = err;
3356
      } finally {
3357
        try {
3358
          if (!_iteratorNormalCompletion34 && _iterator34["return"] != null) {
3359
            _iterator34["return"]();
3360
          }
3361
        } finally {
3362
          if (_didIteratorError34) {
3363
            throw _iteratorError34;
0 ignored issues
show
Comprehensibility Bug introduced by
Usage of the throw statement in a finally clause is discouraged. This construct may mask errors and makes debugging difficult.
Loading history...
3364
          }
3365
        }
3366
      }
3367
    } catch (e) {
3368
      elements = null;
3369
    }
3370
  } else if (typeof els === "string") {
3371
    elements = [];
3372
    var _iteratorNormalCompletion35 = true;
3373
    var _didIteratorError35 = false;
3374
    var _iteratorError35 = undefined;
0 ignored issues
show
Unused Code Comprehensibility introduced by
The assignment of undefined is not necessary as _iteratorError35 is implicitly marked as undefined by the declaration.
Loading history...
3375
3376
    try {
3377
      for (var _iterator35 = document.querySelectorAll(els)[Symbol.iterator](), _step35; !(_iteratorNormalCompletion35 = (_step35 = _iterator35.next()).done); _iteratorNormalCompletion35 = true) {
3378
        el = _step35.value;
3379
        elements.push(el);
3380
      }
3381
    } catch (err) {
3382
      _didIteratorError35 = true;
3383
      _iteratorError35 = err;
3384
    } finally {
3385
      try {
3386
        if (!_iteratorNormalCompletion35 && _iterator35["return"] != null) {
3387
          _iterator35["return"]();
3388
        }
3389
      } finally {
3390
        if (_didIteratorError35) {
3391
          throw _iteratorError35;
0 ignored issues
show
Comprehensibility Bug introduced by
Usage of the throw statement in a finally clause is discouraged. This construct may mask errors and makes debugging difficult.
Loading history...
3392
        }
3393
      }
3394
    }
3395
  } else if (els.nodeType != null) {
3396
    elements = [els];
3397
  }
3398
3399
  if (elements == null || !elements.length) {
0 ignored issues
show
Bug introduced by
The variable elements does not seem to be initialized in case els.nodeType != null on line 3395 is false. Are you sure this can never be the case?
Loading history...
3400
    throw new Error("Invalid `".concat(name, "` option provided. Please provide a CSS selector, a plain HTML element or a list of those."));
3401
  }
3402
3403
  return elements;
3404
}; // Asks the user the question and calls accepted or rejected accordingly
3405
//
3406
// The default implementation just uses `window.confirm` and then calls the
3407
// appropriate callback.
3408
3409
3410
Dropzone.confirm = function (question, accepted, rejected) {
3411
  if (window.confirm(question)) {
3412
    return accepted();
3413
  } else if (rejected != null) {
3414
    return rejected();
3415
  }
3416
}; // Validates the mime type like this:
3417
//
3418
// https://developer.mozilla.org/en-US/docs/HTML/Element/input#attr-accept
3419
3420
3421
Dropzone.isValidFile = function (file, acceptedFiles) {
3422
  if (!acceptedFiles) {
3423
    return true;
3424
  } // If there are no accepted mime types, it's OK
3425
3426
3427
  acceptedFiles = acceptedFiles.split(",");
3428
  var mimeType = file.type;
3429
  var baseMimeType = mimeType.replace(/\/.*$/, "");
3430
  var _iteratorNormalCompletion36 = true;
3431
  var _didIteratorError36 = false;
3432
  var _iteratorError36 = undefined;
0 ignored issues
show
Unused Code Comprehensibility introduced by
The assignment of undefined is not necessary as _iteratorError36 is implicitly marked as undefined by the declaration.
Loading history...
3433
3434
  try {
3435
    for (var _iterator36 = acceptedFiles[Symbol.iterator](), _step36; !(_iteratorNormalCompletion36 = (_step36 = _iterator36.next()).done); _iteratorNormalCompletion36 = true) {
3436
      var validType = _step36.value;
3437
      validType = validType.trim();
3438
3439
      if (validType.charAt(0) === ".") {
3440
        if (file.name.toLowerCase().indexOf(validType.toLowerCase(), file.name.length - validType.length) !== -1) {
3441
          return true;
3442
        }
3443
      } else if (/\/\*$/.test(validType)) {
3444
        // This is something like a image/* mime type
3445
        if (baseMimeType === validType.replace(/\/.*$/, "")) {
3446
          return true;
3447
        }
3448
      } else {
3449
        if (mimeType === validType) {
3450
          return true;
3451
        }
3452
      }
3453
    }
3454
  } catch (err) {
3455
    _didIteratorError36 = true;
3456
    _iteratorError36 = err;
3457
  } finally {
3458
    try {
3459
      if (!_iteratorNormalCompletion36 && _iterator36["return"] != null) {
3460
        _iterator36["return"]();
3461
      }
3462
    } finally {
3463
      if (_didIteratorError36) {
3464
        throw _iteratorError36;
0 ignored issues
show
Comprehensibility Bug introduced by
Usage of the throw statement in a finally clause is discouraged. This construct may mask errors and makes debugging difficult.
Loading history...
3465
      }
3466
    }
3467
  }
3468
3469
  return false;
3470
}; // Augment jQuery
3471
3472
3473
if (typeof jQuery !== 'undefined' && jQuery !== null) {
3474
  jQuery.fn.dropzone = function (options) {
3475
    return this.each(function () {
3476
      return new Dropzone(this, options);
3477
    });
3478
  };
3479
}
3480
3481
if (typeof module !== 'undefined' && module !== null) {
3482
  module.exports = Dropzone;
3483
} else {
3484
  window.Dropzone = Dropzone;
3485
} // Dropzone file status codes
3486
3487
3488
Dropzone.ADDED = "added";
3489
Dropzone.QUEUED = "queued"; // For backwards compatibility. Now, if a file is accepted, it's either queued
3490
// or uploading.
3491
3492
Dropzone.ACCEPTED = Dropzone.QUEUED;
3493
Dropzone.UPLOADING = "uploading";
3494
Dropzone.PROCESSING = Dropzone.UPLOADING; // alias
3495
3496
Dropzone.CANCELED = "canceled";
3497
Dropzone.ERROR = "error";
3498
Dropzone.SUCCESS = "success";
3499
/*
3500
3501
 Bugfix for iOS 6 and 7
3502
 Source: http://stackoverflow.com/questions/11929099/html5-canvas-drawimage-ratio-bug-ios
3503
 based on the work of https://github.com/stomita/ios-imagefile-megapixel
3504
3505
 */
3506
// Detecting vertical squash in loaded image.
3507
// Fixes a bug which squash image vertically while drawing into canvas for some images.
3508
// This is a bug in iOS6 devices. This function from https://github.com/stomita/ios-imagefile-megapixel
3509
3510
var detectVerticalSquash = function detectVerticalSquash(img) {
3511
  var iw = img.naturalWidth;
0 ignored issues
show
Unused Code introduced by
The variable iw seems to be never used. Consider removing it.
Loading history...
3512
  var ih = img.naturalHeight;
3513
  var canvas = document.createElement("canvas");
3514
  canvas.width = 1;
3515
  canvas.height = ih;
3516
  var ctx = canvas.getContext("2d");
3517
  ctx.drawImage(img, 0, 0);
3518
3519
  var _ctx$getImageData = ctx.getImageData(1, 0, 1, ih),
3520
      data = _ctx$getImageData.data; // search image edge pixel position in case it is squashed vertically.
3521
3522
3523
  var sy = 0;
3524
  var ey = ih;
3525
  var py = ih;
3526
3527
  while (py > sy) {
3528
    var alpha = data[(py - 1) * 4 + 3];
3529
3530
    if (alpha === 0) {
3531
      ey = py;
3532
    } else {
3533
      sy = py;
3534
    }
3535
3536
    py = ey + sy >> 1;
3537
  }
3538
3539
  var ratio = py / ih;
3540
3541
  if (ratio === 0) {
3542
    return 1;
3543
  } else {
3544
    return ratio;
3545
  }
3546
}; // A replacement for context.drawImage
3547
// (args are for source and destination).
3548
3549
3550
var drawImageIOSFix = function drawImageIOSFix(ctx, img, sx, sy, sw, sh, dx, dy, dw, dh) {
3551
  var vertSquashRatio = detectVerticalSquash(img);
3552
  return ctx.drawImage(img, sx, sy, sw, sh, dx, dy, dw, dh / vertSquashRatio);
3553
}; // Based on MinifyJpeg
3554
// Source: http://www.perry.cz/files/ExifRestorer.js
3555
// http://elicon.blog57.fc2.com/blog-entry-206.html
3556
3557
3558
var ExifRestore =
3559
/*#__PURE__*/
3560
function () {
3561
  function ExifRestore() {
3562
    _classCallCheck(this, ExifRestore);
3563
  }
3564
3565
  _createClass(ExifRestore, null, [{
3566
    key: "initClass",
3567
    value: function initClass() {
3568
      this.KEY_STR = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=';
3569
    }
3570
  }, {
3571
    key: "encode64",
3572
    value: function encode64(input) {
3573
      var output = '';
3574
      var chr1 = undefined;
0 ignored issues
show
Unused Code Comprehensibility introduced by
The assignment of undefined is not necessary as chr1 is implicitly marked as undefined by the declaration.
Loading history...
3575
      var chr2 = undefined;
0 ignored issues
show
Unused Code Comprehensibility introduced by
The assignment of undefined is not necessary as chr2 is implicitly marked as undefined by the declaration.
Loading history...
3576
      var chr3 = '';
3577
      var enc1 = undefined;
0 ignored issues
show
Unused Code Comprehensibility introduced by
The assignment of undefined is not necessary as enc1 is implicitly marked as undefined by the declaration.
Loading history...
3578
      var enc2 = undefined;
0 ignored issues
show
Unused Code Comprehensibility introduced by
The assignment of undefined is not necessary as enc2 is implicitly marked as undefined by the declaration.
Loading history...
3579
      var enc3 = undefined;
0 ignored issues
show
Unused Code Comprehensibility introduced by
The assignment of undefined is not necessary as enc3 is implicitly marked as undefined by the declaration.
Loading history...
3580
      var enc4 = '';
3581
      var i = 0;
3582
3583
      while (true) {
3584
        chr1 = input[i++];
3585
        chr2 = input[i++];
3586
        chr3 = input[i++];
3587
        enc1 = chr1 >> 2;
3588
        enc2 = (chr1 & 3) << 4 | chr2 >> 4;
3589
        enc3 = (chr2 & 15) << 2 | chr3 >> 6;
3590
        enc4 = chr3 & 63;
3591
3592
        if (isNaN(chr2)) {
3593
          enc3 = enc4 = 64;
3594
        } else if (isNaN(chr3)) {
3595
          enc4 = 64;
3596
        }
3597
3598
        output = output + this.KEY_STR.charAt(enc1) + this.KEY_STR.charAt(enc2) + this.KEY_STR.charAt(enc3) + this.KEY_STR.charAt(enc4);
3599
        chr1 = chr2 = chr3 = '';
0 ignored issues
show
Unused Code introduced by
The assignment to variable chr2 seems to be never used. Consider removing it.
Loading history...
Unused Code introduced by
The assignment to variable chr3 seems to be never used. Consider removing it.
Loading history...
Unused Code introduced by
The assignment to variable chr1 seems to be never used. Consider removing it.
Loading history...
3600
        enc1 = enc2 = enc3 = enc4 = '';
0 ignored issues
show
Unused Code introduced by
The assignment to variable enc4 seems to be never used. Consider removing it.
Loading history...
Unused Code introduced by
The assignment to variable enc2 seems to be never used. Consider removing it.
Loading history...
Unused Code introduced by
The assignment to variable enc3 seems to be never used. Consider removing it.
Loading history...
Unused Code introduced by
The assignment to variable enc1 seems to be never used. Consider removing it.
Loading history...
3601
3602
        if (!(i < input.length)) {
3603
          break;
3604
        }
3605
      }
3606
3607
      return output;
3608
    }
3609
  }, {
3610
    key: "restore",
3611
    value: function restore(origFileBase64, resizedFileBase64) {
3612
      if (!origFileBase64.match('data:image/jpeg;base64,')) {
3613
        return resizedFileBase64;
3614
      }
3615
3616
      var rawImage = this.decode64(origFileBase64.replace('data:image/jpeg;base64,', ''));
3617
      var segments = this.slice2Segments(rawImage);
3618
      var image = this.exifManipulation(resizedFileBase64, segments);
3619
      return "data:image/jpeg;base64,".concat(this.encode64(image));
3620
    }
3621
  }, {
3622
    key: "exifManipulation",
3623
    value: function exifManipulation(resizedFileBase64, segments) {
3624
      var exifArray = this.getExifArray(segments);
3625
      var newImageArray = this.insertExif(resizedFileBase64, exifArray);
3626
      var aBuffer = new Uint8Array(newImageArray);
3627
      return aBuffer;
3628
    }
3629
  }, {
3630
    key: "getExifArray",
3631
    value: function getExifArray(segments) {
3632
      var seg = undefined;
0 ignored issues
show
Unused Code Comprehensibility introduced by
The assignment of undefined is not necessary as seg is implicitly marked as undefined by the declaration.
Loading history...
3633
      var x = 0;
3634
3635
      while (x < segments.length) {
3636
        seg = segments[x];
3637
3638
        if (seg[0] === 255 & seg[1] === 225) {
0 ignored issues
show
introduced by
You have used a bitwise operator & in a condition. Did you maybe want to use the logical operator &&
Loading history...
3639
          return seg;
3640
        }
3641
3642
        x++;
3643
      }
3644
3645
      return [];
3646
    }
3647
  }, {
3648
    key: "insertExif",
3649
    value: function insertExif(resizedFileBase64, exifArray) {
3650
      var imageData = resizedFileBase64.replace('data:image/jpeg;base64,', '');
3651
      var buf = this.decode64(imageData);
3652
      var separatePoint = buf.indexOf(255, 3);
3653
      var mae = buf.slice(0, separatePoint);
3654
      var ato = buf.slice(separatePoint);
3655
      var array = mae;
3656
      array = array.concat(exifArray);
3657
      array = array.concat(ato);
3658
      return array;
3659
    }
3660
  }, {
3661
    key: "slice2Segments",
3662
    value: function slice2Segments(rawImageArray) {
3663
      var head = 0;
3664
      var segments = [];
3665
3666
      while (true) {
3667
        var length;
3668
3669
        if (rawImageArray[head] === 255 & rawImageArray[head + 1] === 218) {
0 ignored issues
show
introduced by
You have used a bitwise operator & in a condition. Did you maybe want to use the logical operator &&
Loading history...
3670
          break;
3671
        }
3672
3673
        if (rawImageArray[head] === 255 & rawImageArray[head + 1] === 216) {
0 ignored issues
show
introduced by
You have used a bitwise operator & in a condition. Did you maybe want to use the logical operator &&
Loading history...
3674
          head += 2;
3675
        } else {
3676
          length = rawImageArray[head + 2] * 256 + rawImageArray[head + 3];
3677
          var endPoint = head + length + 2;
3678
          var seg = rawImageArray.slice(head, endPoint);
3679
          segments.push(seg);
3680
          head = endPoint;
3681
        }
3682
3683
        if (head > rawImageArray.length) {
3684
          break;
3685
        }
3686
      }
3687
3688
      return segments;
3689
    }
3690
  }, {
3691
    key: "decode64",
3692
    value: function decode64(input) {
3693
      var output = '';
0 ignored issues
show
Unused Code introduced by
The variable output seems to be never used. Consider removing it.
Loading history...
3694
      var chr1 = undefined;
0 ignored issues
show
Unused Code Comprehensibility introduced by
The assignment of undefined is not necessary as chr1 is implicitly marked as undefined by the declaration.
Loading history...
3695
      var chr2 = undefined;
0 ignored issues
show
Unused Code Comprehensibility introduced by
The assignment of undefined is not necessary as chr2 is implicitly marked as undefined by the declaration.
Loading history...
3696
      var chr3 = '';
3697
      var enc1 = undefined;
0 ignored issues
show
Unused Code Comprehensibility introduced by
The assignment of undefined is not necessary as enc1 is implicitly marked as undefined by the declaration.
Loading history...
3698
      var enc2 = undefined;
0 ignored issues
show
Unused Code Comprehensibility introduced by
The assignment of undefined is not necessary as enc2 is implicitly marked as undefined by the declaration.
Loading history...
3699
      var enc3 = undefined;
0 ignored issues
show
Unused Code Comprehensibility introduced by
The assignment of undefined is not necessary as enc3 is implicitly marked as undefined by the declaration.
Loading history...
3700
      var enc4 = '';
3701
      var i = 0;
3702
      var buf = []; // remove all characters that are not A-Z, a-z, 0-9, +, /, or =
3703
3704
      var base64test = /[^A-Za-z0-9\+\/\=]/g;
3705
3706
      if (base64test.exec(input)) {
3707
        console.warn('There were invalid base64 characters in the input text.\nValid base64 characters are A-Z, a-z, 0-9, \'+\', \'/\',and \'=\'\nExpect errors in decoding.');
3708
      }
3709
3710
      input = input.replace(/[^A-Za-z0-9\+\/\=]/g, '');
3711
3712
      while (true) {
3713
        enc1 = this.KEY_STR.indexOf(input.charAt(i++));
3714
        enc2 = this.KEY_STR.indexOf(input.charAt(i++));
3715
        enc3 = this.KEY_STR.indexOf(input.charAt(i++));
3716
        enc4 = this.KEY_STR.indexOf(input.charAt(i++));
3717
        chr1 = enc1 << 2 | enc2 >> 4;
3718
        chr2 = (enc2 & 15) << 4 | enc3 >> 2;
3719
        chr3 = (enc3 & 3) << 6 | enc4;
3720
        buf.push(chr1);
3721
3722
        if (enc3 !== 64) {
3723
          buf.push(chr2);
3724
        }
3725
3726
        if (enc4 !== 64) {
3727
          buf.push(chr3);
3728
        }
3729
3730
        chr1 = chr2 = chr3 = '';
0 ignored issues
show
Unused Code introduced by
The assignment to variable chr3 seems to be never used. Consider removing it.
Loading history...
Unused Code introduced by
The assignment to variable chr2 seems to be never used. Consider removing it.
Loading history...
Unused Code introduced by
The assignment to variable chr1 seems to be never used. Consider removing it.
Loading history...
3731
        enc1 = enc2 = enc3 = enc4 = '';
0 ignored issues
show
Unused Code introduced by
The assignment to variable enc4 seems to be never used. Consider removing it.
Loading history...
Unused Code introduced by
The assignment to variable enc2 seems to be never used. Consider removing it.
Loading history...
Unused Code introduced by
The assignment to variable enc3 seems to be never used. Consider removing it.
Loading history...
Unused Code introduced by
The assignment to variable enc1 seems to be never used. Consider removing it.
Loading history...
3732
3733
        if (!(i < input.length)) {
3734
          break;
3735
        }
3736
      }
3737
3738
      return buf;
3739
    }
3740
  }]);
3741
3742
  return ExifRestore;
3743
}();
3744
3745
ExifRestore.initClass();
3746
/*
3747
 * contentloaded.js
3748
 *
3749
 * Author: Diego Perini (diego.perini at gmail.com)
3750
 * Summary: cross-browser wrapper for DOMContentLoaded
3751
 * Updated: 20101020
3752
 * License: MIT
3753
 * Version: 1.2
3754
 *
3755
 * URL:
3756
 * http://javascript.nwbox.com/ContentLoaded/
3757
 * http://javascript.nwbox.com/ContentLoaded/MIT-LICENSE
3758
 */
3759
// @win window reference
3760
// @fn function reference
3761
3762
var contentLoaded = function contentLoaded(win, fn) {
3763
  var done = false;
3764
  var top = true;
0 ignored issues
show
Unused Code introduced by
The assignment to variable top seems to be never used. Consider removing it.
Loading history...
3765
  var doc = win.document;
3766
  var root = doc.documentElement;
3767
  var add = doc.addEventListener ? "addEventListener" : "attachEvent";
3768
  var rem = doc.addEventListener ? "removeEventListener" : "detachEvent";
3769
  var pre = doc.addEventListener ? "" : "on";
3770
3771
  var init = function init(e) {
3772
    if (e.type === "readystatechange" && doc.readyState !== "complete") {
3773
      return;
0 ignored issues
show
Comprehensibility Best Practice introduced by
Are you sure this return statement is not missing an argument? If this is intended, consider adding an explicit undefined like return undefined;.
Loading history...
3774
    }
3775
3776
    (e.type === "load" ? win : doc)[rem](pre + e.type, init, false);
3777
3778
    if (!done && (done = true)) {
3779
      return fn.call(win, e.type || e);
3780
    }
3781
  };
3782
3783
  var poll = function poll() {
3784
    try {
3785
      root.doScroll("left");
3786
    } catch (e) {
3787
      setTimeout(poll, 50);
3788
      return;
0 ignored issues
show
Comprehensibility Best Practice introduced by
Are you sure this return statement is not missing an argument? If this is intended, consider adding an explicit undefined like return undefined;.
Loading history...
3789
    }
3790
3791
    return init("poll");
3792
  };
3793
3794
  if (doc.readyState !== "complete") {
3795
    if (doc.createEventObject && root.doScroll) {
3796
      try {
3797
        top = !win.frameElement;
3798
      } catch (error) {}
0 ignored issues
show
Coding Style Comprehensibility Best Practice introduced by
Empty catch clauses should be used with caution; consider adding a comment why this is needed.
Loading history...
3799
3800
      if (top) {
3801
        poll();
3802
      }
3803
    }
3804
3805
    doc[add](pre + "DOMContentLoaded", init, false);
3806
    doc[add](pre + "readystatechange", init, false);
3807
    return win[add](pre + "load", init, false);
3808
  }
3809
}; // As a single function to be able to write tests.
3810
3811
3812
Dropzone._autoDiscoverFunction = function () {
3813
  if (Dropzone.autoDiscover) {
3814
    return Dropzone.discover();
3815
  }
3816
};
3817
3818
contentLoaded(window, Dropzone._autoDiscoverFunction);
3819
3820
function __guard__(value, transform) {
3821
  return typeof value !== 'undefined' && value !== null ? transform(value) : undefined;
3822
}
3823
3824
function __guardMethod__(obj, methodName, transform) {
3825
  if (typeof obj !== 'undefined' && obj !== null && typeof obj[methodName] === 'function') {
3826
    return transform(obj, methodName);
3827
  } else {
3828
    return undefined;
3829
  }
3830
}
3831